home *** CD-ROM | disk | FTP | other *** search
- ⓪ MODULE MM2TinyShell; (*$Z+,P+,V+,R-*)⓪ ⓪ (*⓪!*----------------------------------------------------------------------------⓪!* Copyright Februar 1987 Thomas Tempelmann & Manuel Chakravarty⓪!*----------------------------------------------------------------------------⓪!* Modul-Beschreibung : GEM-Tiny-Shell für MOS / Megamax Modula-2⓪!*----------------------------------------------------------------------------⓪!* Version : 2.3g / Interne Version: V#0117⓪!*----------------------------------------------------------------------------⓪!* MCH: Manuel Chakravarty⓪!* TT: Thomas Tempelmann⓪!* MS: Michael Seyfried, Unterer Mauergarten 17, D-W6520 Worms 24⓪!*----------------------------------------------------------------------------⓪!* Datum Version Autor Bemerkung (Arbeitsbericht)⓪!*----------------------------------------------------------------------------⓪!* 01.12.90 2.1p MCH Übernahme aller Teile der MM2Shell, die keine ⓪!* Fenster benutzen⓪!* 03.12.90 2.1p MCH Neue Workfilebehandlung und neue Resource⓪!* 07.12.90 2.2 TT Anpassung an MM2Shell 2.2⓪!* 07.04.91 2.2b TT Höhe der Menüzeile korrigiert; ACCs werden vor/nach⓪!* Start von Programmen geschlossen;⓪!* Batch-Befehle "POSTAMBLE1/2" zum Starten von Prgs⓪!* vor Verlassen der Shell; ExitSS-Aufruf am Ende des⓪!* Moduls _hinter_ den ShellWrite-Aufruf verlegt;⓪!* Codename von Workfiles wird nun korrekt behalten.⓪!* 20.05.91 2.2d TT Bei manueller Arbeitsdateieingabe wird die Datei⓪!* auf den Source-Pfaden gesucht.⓪!* 20.10.91 2.3 TT Linker-Option-Box ermöglicht Symboldatei-Erzeugung.⓪!* MS Shell nun MultiGEM-fähig, dazu 'call' überarbeitet.⓪!* 14.01.93 2.3e TT⓪!*----------------------------------------------------------------------------⓪!*)⓪ ⓪ ⓪ (* Qualified imports for 'ShellShell' *)⓪ ⓪ IMPORT Clock, ModCtrl,⓪ ⓪'GEMBase, AESMisc,⓪'GrafBase, GEMGlobals, GEMEnv,⓪'AESForms, AESObjects, AESResources, AESGraphics, AESMenus,⓪'AESWindows, AESEvents,⓪'ObjHandler, EventHandler, EasyGEM0, EasyGEM1;⓪ ⓪ ⓪ FROM SYSTEM IMPORT LONGWORD, WORD, ADDRESS, BYTE,⓪7ASSEMBLER, ADR, LOAD, STORE;⓪ ⓪ IMPORT Mm2tinysRsc; (* RSC-Datei *)⓪ ⓪ FROM RealCtrl IMPORT AnyRealFormat, UsedFormat;⓪ ⓪ FROM StrConv IMPORT CardToStr, IntToStr, StrToLCard, StrToCard,⓪7StrToInt, LHexToStr;⓪ ⓪ FROM Loader IMPORT LoaderResults, DefaultStackSize,⓪7LoadModule, CallModule, UnLoadModule;⓪ ⓪ FROM PathEnv IMPORT HomeReplaced, HomeSymbol, ReplaceHome, HomePath;⓪ FROM PathCtrl IMPORT PathList;⓪ FROM Paths IMPORT SearchFile, ListPos;⓪ ⓪ FROM Storage IMPORT ALLOCATE, DEALLOCATE, MemAvail, AllAvail, Inconsistent;⓪ ⓪ FROM Strings IMPORT PosLen, String, Relation, Compare, Space, Upper, Empty,⓪7EatSpaces, Append, StrEqual, Delete, Concat, Assign,⓪7Split, Insert, Length, Copy, Pos;⓪ ⓪ IMPORT Lists;⓪ ⓪ IMPORT SysUtil0;⓪ ⓪ FROM MOSConfig IMPORT StdDateMask;⓪ IMPORT MOSConfig;⓪ ⓪ IMPORT MOSCtrl;⓪ ⓪ FROM MOSGlobals IMPORT MemArea, BusFault, OddBusAddr, NoValidRETURN,⓪7OutOfStack, FileStr, PathStr, NameStr,⓪7fOK, fFileNotFound, fDriveNotReady, fWriteProtected,⓪7fPathNotFound, fInvalidDrive, fAccessDenied,⓪7fTooManyOpen, fInsufficientMemory,⓪7Drive, DriveSet, fEOF;⓪ ⓪ FROM ShellMsg IMPORT ScanMode, ScanAddr, TextName, ErrorMsg, DefPaths,⓪7ModPaths, ErrListFile, ImpPaths, SrcPaths, DefSfx,⓪7ImpSfx, ModSfx, CodeName, Active, LinkDesc, ⓪7LLRange, ScanIndex, TextLine, TextCol,⓪7MakeFileName, TemporaryPath, MainOutputPath,⓪7DefLibName, DefOutPath, ImpOutPath, ModOutPath,⓪7ShellPath, ImpSrcSfx, ModSrcSfx, DefSrcSfx, CodeSize,⓪7StdPaths, CompilerArgs, CompilerParm, ScanOpts,⓪7LinkMode, LinkerParm, EditorParm;⓪ ⓪ IMPORT Directory;⓪ FROM Directory IMPORT FileAttr, FileAttrSet, DirEntry, DirQueryProc,⓪7SetCurrentDir, GetCurrentDir, DefaultDrive,⓪7DirQuery, SetDefaultDrive, DrivesOnline,⓪7CreateDir, GetDefaultPath, SetFileAttr,⓪7ForceMediaChange, MakeFullPath, SetDefaultPath,⓪7FreeSpace;⓪ ⓪ FROM FileNames IMPORT StrToDrive, SplitPath, SplitName, DriveToStr,⓪7NameConc, ValidatePath, ConcatPath, ConcatName,⓪7FileName, FilePath;⓪ ⓪ FROM Files IMPORT File, Access, ReplaceMode,⓪7Create, Open, Close, State, ResetState, GetStateMsg,⓪7Remove, EOF, SetDateTime, GetDateTime;⓪ ⓪ FROM Binary IMPORT ReadBlock, ReadBytes, WriteBlock;⓪ ⓪ IMPORT Text;⓪ ⓪ FROM GEMScan IMPORT InputScan, CallingChain, ChainDepth;⓪ ⓪ FROM PrgCtrl IMPORT EnvlpCarrier,⓪7SetEnvelope, TermProcess;⓪4⓪ FROM SysTypes IMPORT ExcDesc, ExcSet, TRAP5;⓪ ⓪ FROM Excepts IMPORT InstallPreExc;⓪ ⓪ FROM SysBuffers IMPORT ExceptsStack;⓪ ⓪ FROM EasyGEM0 IMPORT WrapAlert;⓪ ⓪ FROM UserBreak IMPORT EnableBreak, DisableBreak;⓪ ⓪ FROM KbdEvents IMPORT DeInstallKbdEvents, InstallKbdEvents;⓪ ⓪ FROM EasyGEM0 IMPORT SetGetMode, ShowArrow, HideMouse, ShowMouse; ⓪ ⓪ FROM AESForms IMPORT FormError, FormAlert;⓪ ⓪ IMPORT InOutBase;⓪ ⓪ ⓪ CONST (* Versionskennung der Shell.⓪)*)⓪(ShellRevision = ' 2.3g ';⓪(⓪((*⓪)* Ist die folg. Konstante TRUE, wird das Modul "KbdEvents"⓪)* verwendet, das dafür sorgt, daß Tastendrücke, bei denen⓪)* Shift, Control oder Alternate gedrückt werden, immer richtig⓪)* erkannt werden.⓪)* Andernfalls kann es passieren, daß diese Umschalttasten⓪)* ignoriert werden, wenn die gewünschte Aktion erst nach⓪)* dem Tastendruck gestartet wird.⓪)* Siehe auch Hinweise im Definitions-Text des Moduls⓪)*)⓪(UseExtKeys = TRUE;⓪ ⓪((*⓪)* Ist die folg. Konstante TRUE, startet die Shell GEM-Programme⓪)* korrekt mit der AES-Funktion "ShellWrite", sofern TOS 1.4⓪)* oder höher verwendet wird. Dies kann aber zu Problemen führen,⓪)* beispielsweise, wenn die Shell von NEODESK gestartet wird,⓪)* weshalb sie dazu auf FALSE gesetzt werden kann.⓪)*)⓪(DoShellWrite = TRUE;⓪(⓪((*⓪)* Stack-Größen für die Systemprogramme. Sie sollten vergrößert⓪)* werden, wenn bei einem der Programme ein "Stacküberlauf"⓪)* auftritt.⓪)*)⓪(CompilerStackSize = 16000;⓪(LinkerStackSize = 8000;⓪(EditorStackSize = 16000;⓪(MakeStackSize = 8000;⓪ ⓪((*⓪)* Maximale Anzahl von Suchpfaden, die in einer Batch-Datei⓪)* definiert werden können. Ist zu erhöhen, wenn bim Starten⓪)* der Shell oder eines Batches eine diesbezügliche Fehler-⓪)* meldung erscheint.⓪)*)⓪(MaxSearchPaths = 40;⓪ ⓪((*⓪)* Name der Datei in der alle zu compilierenden Module⓪)* vom Make abgelegt werden. Das Verzeichnis (Pfad), in dem⓪)* diese Datei erzeugt wird, ist der "temporäre Pfad", der⓪)* in der Shell-Parameter-Box anzugeben ist!⓪)*)⓪(MakeCompFileName = 'MAKE.M2C';⓪ ⓪ ⓪ TYPE actionType = (doEdit, doComp, doLink, doExec, doScan, doCpEx,⓪;doLoad, doUnLd, doCont, doBtch, doParm, doMake,⓪;doMkEx, doDftM);⓪(MySuf = (prg, app, tos, ttp, mos, mtp, mod, def, imp, m2p,⓪;m2b, m2m, m2d);⓪ ⓪(Str128 = ARRAY [0..127] OF CHAR;⓪ ⓪(ptrString = POINTER TO String;⓪ ⓪(PathEntry = POINTER TO PathStr;⓪ ⓪ VAR lastFn, currFn,⓪(workFName, workCName : FileStr;⓪(args : ARRAY[0..127] OF CHAR;⓪ ⓪(suf: ARRAY MySuf OF ARRAY [0..2] OF CHAR;⓪ ⓪ ⓪0(* Konfigurationsvariablen *)⓪0(* ======================= *)⓪ ⓪(shellParm : RECORD⓪<breakActive : BOOLEAN;⓪<batchPath : PathStr;⓪<parameterPath : PathStr;⓪<sectors : CARDINAL;⓪<tracks : CARDINAL;⓪<sides : CARDINAL;⓪<makeName : String;⓪<(* TRUE: Nach TOS/TTP-Prgs auf Taste warten *)⓪<waitOnReturn : BOOLEAN;⓪:END;⓪ ⓪(noDirChange: BOOLEAN;⓪ ⓪ ⓪ ⓪ PROCEDURE conc ( REF s1,s2: ARRAY OF CHAR ): Str128;⓪"VAR s: Str128;⓪&voidO: BOOLEAN;⓪"BEGIN⓪$Concat (s1,s2,s, voidO);⓪$RETURN s⓪"END conc;⓪ ⓪ ⓪ FORWARD action (what: actionType; workFile, tool: BOOLEAN);⓪ ⓪ FORWARD FileAlert (errNo: INTEGER);⓪ FORWARD SaveParameter;⓪ FORWARD LoadParameter (REF name: ARRAY OF CHAR; loadInBatch: BOOLEAN);⓪ FORWARD ExecuteBatch (name: ARRAY OF CHAR; load: BOOLEAN);⓪ ⓪ ⓪ MODULE ShellShell; (* Verwaltet die GEM-Aktionen der Modula-Shell *)⓪ ⓪ ⓪ IMPORT Text, SysUtil0,⓪ ⓪0(* resource indices *)⓪ ⓪'Menu, Mibox, Mshell, Mdatei, Mworkfil, Mparms,⓪'Mwork, Mtools, Dinfo, Mdeditwo, Mdcompwo, Mdexecwo,⓪'Mdlinkwo, Mdscanwo, Mdeditot, Mdcompot, Mdexecot,⓪'Mdlinkot, Mdscanot, Mdfolder, Mddelete, Mdquit, Wibox, Mwnew,⓪'Mwdelete, Mwchange, Mwwork1, Mwwork2, Mwwork3, Mwwork4,⓪'Mwwork5, Mwwork6, Mwwork7, Mwwork8, Mwwork9, Mwwork0,⓪'Mpshell, Mpeditor, Mpcomp, Mplink, Mpsave, Mienv,⓪'Midocu, Mihelp, Tibox, Mtool1, Mtool2, Mtool3,⓪'Mtool4, Mtool5, Mtool6, Mtool7, Mtool8, Mtool9,⓪'Mtool10, Optbox, Oquite, Opmark, Opwidth, Oppath,⓪'Ooutput, Oargs, Olibrary, Oerror, Oname, Oquit,⓪'Ook, Shellbox, Version, Scanbox, Sok, Squit,⓪'Saddr, Snamebox, Snedit, Snok, Snwork, Snquit,⓪'Argbox, Aedit, Aok, Loptbox, Locheck1, Locheck2,⓪'Locheck3, Locheck4, Locheck5, Locheck6, Locheck7, Locheck8,⓪'Lofname1, Lofname2, Lofname3, Lofname4, Lofname5, Lofname6,⓪'Lofname7, Lofname8, Lochecks, Lostack, Lomaxmod, Look,⓪'Loquit, Loname, Lonoopt, Lonamopt, Lomiddle, Lofull,⓪'Lofastld, Lofastco, Lofastme, Losymfil, Loadbox, Lfname, Sparmbox,⓪'Spmake, Spscpath, Spbreak, Spbaname, Sppaname, Spok, Spquit,⓪'Msgbar, Mbmsg, Eparmbox, Epname, Epsearch, Epstoper,⓪'Epshtemp, Epshname, Epedtemp, Epedname, Eparg, Eparname,⓪'Eparpos, Eparerro, Epok, Epquit, Helpbox, Hpnext,⓪'Hpprev, Hpquit, Hpmsgs, Hpmsg1, Hpmsg2, Hpmsg3,⓪'Hpmsg4, Hpmsg5, Hpmsg6, Hpmsg7, Hpmsg8, Hpmsg9,⓪'Hpmsg10, Hpmsg11, Hpmsg12, Hpmsg13, Hpmsg14, Infobox,⓪'Inpath, Inmkfile, Instack, Inblock, Inall, Incode,⓪'Inlength, Realform, Ihome, Inok, Inquit, Stponrtn,⓪'Pathalt, Optalt, Memalt, Debugalt, Noldstr, Okstr,⓪'Nouldstr, Noexestr, Retstr, Edstr, Workstr, Compstr,⓪'Linkstr, Infstr, Contstr, Parmsalt, Noparalt, Nowrkalt,⓪'Exitalt, Nohlpalt, Makestr, Contmalt, Editstr, Editbstr,⓪'Npathstr, Chworkti, Neworkti, Editti, Compti, Execti,⓪'Coexti, Linkti, Scanti, Foldti, Deleti,⓪ ⓪%⓪0(* from the library *)⓪ ⓪'ADDRESS, BYTE, WORD,⓪'ASSEMBLER, ADR, LOAD, STORE,⓪'⓪'(* Storage *)⓪'ALLOCATE, DEALLOCATE, MemAvail, AllAvail,⓪ ⓪'(* RealCtrl *)⓪'AnyRealFormat, UsedFormat,⓪'⓪'(* Strings *)⓪'String, Relation,⓪'Concat, Insert, Split, Assign, Length, Compare, Copy, Space,⓪'Upper, Empty, EatSpaces, Append, StrEqual, PosLen, Delete, Pos,⓪'⓪'MOSConfig,⓪'DefSrcSfx, ImpSrcSfx, ModSrcSfx, StdDateMask,⓪'⓪'(* StrConv *)⓪'CardToStr, IntToStr, StrToCard, StrToLCard, LHexToStr,⓪ ⓪'(* Directory *)⓪'Directory,⓪'FileAttr, FileAttrSet, DirEntry, DirQueryProc, Drive, DriveSet,⓪'DirQuery, SplitPath, SplitName, SetFileAttr, StrToDrive, FreeSpace,⓪'DriveToStr, DefaultDrive, CreateDir, GetCurrentDir, SetDefaultDrive,⓪'SetCurrentDir, FileStr, PathStr, NameStr, DrivesOnline, ValidatePath,⓪'ForceMediaChange, MakeFullPath, ConcatPath, ConcatName, SetDefaultPath,⓪'FileName, GetDefaultPath, FilePath,⓪'⓪'(* ShellMsg *)⓪'ScanMode, TextName, CodeName, DefSfx, ImpSfx, ModSfx, ScanAddr,⓪'ErrListFile, LinkDesc, TemporaryPath, LLRange,⓪'SrcPaths, ShellPath, MakeFileName, DefLibName, MainOutputPath,⓪'ScanOpts, DefPaths, EditorParm, CompilerParm, LinkerParm, LinkMode,⓪'⓪'⓪'(* Loader *)⓪'DefaultStackSize,⓪'⓪'(* MOSGlobals *)⓪'fOK, fEOF, fFileNotFound,⓪'⓪'(* Files *)⓪'File, Access,⓪'State, Open, Close, ResetState,⓪'⓪'(* Binary *)⓪'ReadBlock, WriteBlock,⓪'⓪'(* GEMScan *)⓪'ChainDepth,⓪'⓪'(* MOSGloabls *)⓪'MemArea,⓪'⓪'(* Exceptions *)⓪'TRAP5, ExcSet, ExcDesc,⓪'ExceptsStack, InstallPreExc,⓪'⓪'(* Paths *)⓪'ListPos,⓪'ReplaceHome, SearchFile,⓪'HomePath, HomeSymbol,⓪'⓪'(* PrgCtrl *)⓪'TermProcess,⓪'⓪'(* from the outer module *)⓪'CompilerArgs,⓪'actionType, Str128,⓪'lastFn, currFn, MySuf, ShellRevision,⓪'action, suf, args, noDirChange, shellParm, conc,⓪'SaveParameter, LoadParameter, FileAlert, ExecuteBatch;⓪ ⓪ (* MOS *)⓪ ⓪ FROM MOSCtrl IMPORT RealMode;⓪ ⓪ FROM Clock IMPORT Date, Time;⓪ ⓪ FROM ModCtrl IMPORT ModQuery;⓪ ⓪ FROM Lists IMPORT List, LDir, InitList,⓪?CreateList, DeleteList, ResetList, AppendEntry,⓪?InsertEntry, NextEntry, PrevEntry, RemoveEntry,⓪?CurrentEntry, ListEmpty, ScanEntries,⓪?NoOfEntries, EndOfList;⓪ ⓪ (* Graphics *)⓪ ⓪ FROM GrafBase IMPORT black, Pnt, Rect, PtrBitPattern, WritingMode,⓪7Point, Rectangle, TransRect, MinPoint, ClipRect,⓪7FrameRects;⓪5⓪ (* General GEM *)⓪ ⓪ FROM GEMGlobals IMPORT Root, MaxDepth, NoObject, MaxStr,⓪7PtrObjTree, GemChar, MouseButton, MButtonSet,⓪7SpecialKeySet, ObjState, OStateSet, ObjFlag,⓪7OFlagSet, ObjType, FillType, SpecialKey, PtrMaxStr,⓪7LineType;⓪ ⓪ FROM GEMEnv IMPORT RC, GemHandle, DeviceHandle, DevParm, PtrDevParm,⓪7InitGem, ExitGem, GemActive, CurrGemHandle,⓪7SetCurrGemHandle, GemError, MouseInput, DeviceParameter;⓪ ⓪ (* AES *)⓪ ⓪ FROM AESForms IMPORT FormDialMode,⓪?FormDial, FormDo, FormAlert;⓪ ⓪ FROM AESObjects IMPORT FindObject, DrawObject;⓪ ⓪ FROM AESResources IMPORT ResourcePart,⓪?LoadResource, FreeResource, ResourceAddr;⓪ ⓪ FROM AESWindows IMPORT SetNewDesk;⓪ ⓪ FROM AESGraphics IMPORT MouseForm,⓪?DragBox, MouseKeyState, GrafMouse, RubberBox;⓪ ⓪ FROM AESMenus IMPORT MenuBar, NormalTitle, EnableItem, MenuText,⓪?CheckItem;⓪ ⓪ FROM AESEvents IMPORT menuSelected, Event, RectEnterMode,⓪?MessageBuffer, MultiEvent, EventSet;⓪ ⓪ FROM AESMisc IMPORT ShellGet, ShellRead;⓪ ⓪ IMPORT GEMBase;⓪ ⓪ (* Beyond GEM *)⓪ ⓪ FROM ObjHandler IMPORT SetPtrChoice,⓪?SetCurrObjTree, CurrObjTree,⓪?ObjectState, SetObjSpace, ObjectSpace,⓪?ObjectFlags, BorderThickness, AssignTextStrings,⓪?GetTextStrings, ObjTreeError, LinkTextString,⓪?SetObjFlags, CreateSpecification, ObjectType,⓪?SetObjType, SetIconForm, GetIconForm,⓪?SetIconLook, GetIconLook, GetComplexColor,⓪?SetComplexColor, GetIconColor, SetIconColor,⓪?SetObjState, GetObjRelatives, RightSister;⓪ ⓪ FROM EventHandler IMPORT EventProc, WatchDogCarrier,⓪?HandleEvents, ShareTime, DeInstallWatchDog,⓪?InstallWatchDog, FlushEvents;⓪ ⓪ FROM EasyGEM0 IMPORT SetGetMode, ObjEnumRef,⓪?ShowArrow, HideMouse, ShowMouse,⓪?ObjectSpaceWithAttrs, AbsObjectSpace,⓪?GetTextString, SetTextString, SetObjStateElem,⓪?ToggleObjState, ObjectStateElem, SetObjFlag,⓪?PrepareBox, ReleaseBox, DoSimpleBox,⓪?ForceDeskRedraw, DrawObjInWdw, DeskSize,⓪?DeselectButton, ToggleCheckBox, ToggleCheckPlus,⓪?SetGetBoxLCard, SetGetBoxStr, SetGetBoxEnum,⓪?SetGetBoxState, SetGetBoxCard, CharSize,⓪?ToggleSelectBox, ObjectFlag, TreeAddress,⓪?TextStringAddress;⓪ ⓪ FROM EasyGEM1 IMPORT SelectFile;⓪ ⓪ ⓪ EXPORT TellMode, MaxTool, ToolField, NoPathsStr, EditBatStr,⓪'NoLoadStr, OkStr, NoUnloadStr, NoExecStr, RetStr, EdStr, MakeStr,⓪'WorkStr, CompStr, LinkStr, InfStr, ContMakeAlt, noParmAlt, ContStr,⓪'InitSS, ExitSS, ShowSS, HideSS, TalkWithUser, RequestArg, ScanBox,⓪'TellLoading, ClearDeskAndShowMsg, ShowBee, appl_init, appl_exit,⓪'maxWorkFiles, WorkField, IsSourceName, InitWorkFieldMenuIndizies,⓪'memErrorAlt, ShellName, LastCodeName, LastCodeSize, EditStr,⓪'IsMBTFile, multiGEM, multiTOS;⓪'⓪ ⓪ CONST minNecessaryMem = 50L * 1024L; (* min. 50k Speicher *)⓪ ⓪(screenColumns = 80; (* screen width in chars *)⓪ ⓪(MaxTool = 10;⓪(maxWorkFiles = 10;⓪ ⓪(resourceFile = 'MM2TINYS.RSC';⓪(batchFile = 'MM2TINYS.M2B';⓪(parameterFile = 'MM2TINYS.M2P';⓪(helpFile = 'MM2TINYS.HLP';⓪(fileBoxLength = 41; (* Länge des file box edit strings *)⓪(maxDftPathInfo = 43; (* 'infoBox.Inpath' length *)⓪(maxCodeFileInfo = 43; (* 'infoBox.Incode' length *)⓪(maxDefLibName = 33; (* 'infoBox.Inmkfile' length *)⓪ ⓪(msgStrLen = 70;⓪(⓪(noRscAlt1 = '[3][Das Resource File kann|nicht geladen werden!]';⓪(noRscAlt2 = '[ Bye Bye... ]';⓪(⓪(noGemAlt1 = '[3][Anmeldung beim GEM|ist nicht gelungen!]';⓪(noGemAlt2 = '[ Pech ?! ]';⓪(⓪(memErrorAlt = 'Fehler in Speicherverwaltung|Neustart empfohlen!';⓪(⓪(stdProtWidth = 80; (* Standardbreite des Compilerprotokolls *)⓪(⓪(undoKey = BYTE (97);⓪(⓪((* 'actManager' needs these constants, that are normally defined within⓪)* the resource in the large shell.⓪)*)⓪(Edit = 0;⓪(Compile = 1;⓪(Execute = 2;⓪(Link = 3;⓪(Scan = 4;⓪(Resident = 5;⓪(⓪(⓪ TYPE ptrRectangle = POINTER TO Rectangle;⓪(ptrList = POINTER TO List;⓪(ptrString = POINTER TO String;⓪(⓪ ⓪ CONST noCurrentWorkfile = -1; (* more info at 'WorkField' *)⓪(⓪ VAR⓪0(* globale handles *)⓪ ⓪(dev : DeviceHandle;⓪(gemHdl : GemHandle;⓪(multiGEM : BOOLEAN;⓪(multiTOS : BOOLEAN;⓪(menu, desk, scanBox,⓪(shellBox, optBox,⓪(fileInfoBox, fileBox,⓪(shellParmBox, editorParmBox,⓪(sNameBox, argBox,⓪(linkBox, loadBox,⓪(fNameBox, formatBox,⓪(msgBar, confirmBox,⓪(helpBox, infoBox : PtrObjTree;⓪(⓪(aesPB : GEMBase.AESPB;⓪(vdiPB : GEMBase.VDIPB;⓪(⓪(pathToLongAlt,⓪(cOptToLongAlt, wrgIcon2Alt,⓪(memFullAlt, drvSpaceMsg,⓪(debugAlt, ⓪(NoLoadStr, OkStr, NoPathsStr,⓪(NoUnloadStr, NoExecStr,⓪(RetStr, EdStr, WorkStr,⓪(CompStr, LinkStr, InfStr,⓪(ContMakeAlt, ContStr, EditStr, EditBatStr,⓪(parmSaveAlt, noParmAlt,⓪(noNewWorkAlt, loadFailedAlt,⓪(exitShellAlt, noHelpAlt,⓪(MakeStr, changeWorkTitle,⓪(newWorkTitle, editTitle,⓪(compileTitle, executeTitle,⓪(compExecTitle, linkTitle,⓪(scanTitle, folderTitle,⓪(deleteTitle : PtrMaxStr;⓪(⓪(linkBoxIdx : ARRAY[1..8] OF RECORD⓪8check,⓪8path : CARDINAL;⓪6END;⓪(⓪(ToolField : ARRAY[1..MaxTool] OF RECORD⓪8index : CARDINAL; (* Menu-Obj. *)⓪8⓪8CASE used :BOOLEAN OF⓪:TRUE : name : FileStr;⓪8END;⓪6END;⓪ ⓪((* Contains all work files.⓪)*)⓪(WorkField : RECORD⓪8noUsed : CARDINAL;⓪8current : INTEGER;⓪8elems : ARRAY[0..maxWorkFiles - 1] OF RECORD⓪Mindex : CARDINAL;⓪Mused : BOOLEAN;⓪McodeName : FileStr;⓪MsourceName : FileStr;⓪KEND;⓪8baseHeightOfWibox: INTEGER;⓪6END;⓪(⓪(msgStr : String;⓪ ⓪ ⓪0(* Variablen, die die aktuellen Shellparameter speichern *)⓪ ⓪(quitStatus : (noQuit, quit, quickQuit);⓪(LastCodeName : FileStr;⓪(LastCodeSize : LONGCARD;⓪(⓪0(* Globale Infovariablen *)⓪(⓪(deskSize : Rectangle;⓪(charWidth, charHeight : CARDINAL;⓪(⓪(tellSpace : Rectangle; (* Darf nur von 'TellLoading'⓪Q* benutzt werden.⓪Q*)⓪ ⓪(lastArgs: ARRAY [0..127] OF CHAR;⓪ ⓪(ShellName: PathStr;⓪ ⓪0(* Globale Kurzzeitvariablen *)⓪(⓪(ok : BOOLEAN; (* Siehe auch 'notOKAlert' *)⓪(but : CARDINAL;⓪(⓪0(* global dummies *)⓪(⓪(voidC : CARDINAL;⓪(voidO : BOOLEAN;⓪(voidCh : CHAR;⓪(voidI : INTEGER;⓪(void128 : ARRAY [0..127] OF CHAR;⓪(voidADR : ADDRESS;⓪(voidFrame: Rectangle;⓪ ⓪ ⓪8(* Diverse Hilfsroutinen *)⓪8(* ===================== *)⓪ ⓪((* mouse *)⓪(⓪ PROCEDURE mouseImage;⓪ ⓪"(*$L-*)⓪"BEGIN⓪$ASSEMBLER⓪*DC.W $0, $0, $1, $0, $1⓪*DC.W $07F0,$07F0,$07F0,$07F0,$0FF8,$1FFC,$3FFE,$3FFF⓪*DC.W $3FFF,$3FFF,$1FFF,$0FFF,$0FFF,$07FF,$03FF,$03FE⓪*DC.W $0000,$03E0,$03E0,$02A0,$07F0,$0E38,$1F7C,$1FFD⓪*DC.W $1FFC,$1FFD,$0FF8,$07F2,$07FD,$03E0,$01CA,$01E8⓪$END;⓪"END mouseImage;⓪"(*$L=*)⓪ ⓪ PROCEDURE ShowBee;⓪ ⓪"BEGIN⓪$GrafMouse (userCursor, ADDRESS (mouseImage))⓪"END ShowBee;⓪ ⓪ ⓪ PROCEDURE appl_init;⓪"BEGIN⓪$WITH aesPB DO⓪&WITH pcontrl^ DO⓪(opcode:= 10;⓪(sintin:= 0;⓪(sintout:= 1;⓪(sadrin:= 0;⓪(sadrout:= 0;⓪&END;⓪$END;⓪$GEMBase.CallAES( ADR( aesPB));⓪"END appl_init;⓪ ⓪ PROCEDURE appl_exit;⓪"BEGIN⓪$WITH aesPB DO⓪&WITH pcontrl^ DO⓪(opcode:= 19;⓪(sintin:= 0;⓪(sintout:= 1;⓪(sadrin:= 0;⓪(sadrout:= 0;⓪&END;⓪$END;⓪$GEMBase.CallAES( ADR( aesPB));⓪"END appl_exit;⓪ ⓪ ⓪((* strings *)⓪ ⓪ (* appendSpcTo -- Fügt Spaces an 'str' an, bis 'Length (str) = i'⓪!*)⓪(⓪ PROCEDURE appendSpcTo (i: CARDINAL; VAR str: ARRAY OF CHAR);⓪ ⓪"VAR l : CARDINAL;⓪"⓪"BEGIN⓪$l := HIGH (str);⓪$IF i < l THEN l := i END;⓪$Append (Space (l - Length (str)), str, voidO);⓪"END appendSpcTo;⓪ ⓪ (* truncCopyStr -- 'source' wird nach 'dest' kopiert. Es gibt 'maxDestLen'⓪!* die Größe von 'dest' an, ist 'source' größer, so wird⓪!* der vordere Teil abgeschnitten und ein '..' vorange-⓪!* stellt.⓪!*)⓪!⓪ PROCEDURE truncCopyString ( source : ARRAY OF CHAR;⓪?maxDestLen: CARDINAL;⓪;VAR dest : ARRAY OF CHAR);⓪ ⓪"VAR sourceLen: CARDINAL;⓪ ⓪"BEGIN⓪$sourceLen := Length (source);⓪$IF sourceLen > maxDestLen⓪$THEN⓪&Copy (source, sourceLen - maxDestLen - 2, sourceLen, dest, voidO);⓪&Insert ('..', 0, dest, voidO);⓪$ELSE Assign (source, dest, voidO) END;⓪"END truncCopyString;⓪&⓪&⓪((* lists *)⓪ ⓪ (* deleteSimpleList -- Deletes the list 'l' completly. The elements of the⓪!* list must be dynamical allocated variables and would⓪!* all be disposed.⓪!* If 'killCarrier = TRUE' then list-carrier would be⓪!* deleted.⓪!*)⓪ ⓪ PROCEDURE deleteSimpleList (VAR l: List; killCarrier: BOOLEAN);⓪ ⓪"VAR entry: ADDRESS;⓪ ⓪"BEGIN⓪$ResetList (l);⓪$entry := PrevEntry (l);⓪$WHILE entry # NIL DO⓪&RemoveEntry (l, voidO);⓪&DEALLOCATE (entry, 0L);⓪&entry := CurrentEntry (l);⓪$END;⓪$IF killCarrier THEN DeleteList (l, voidO) END;⓪"END deleteSimpleList;⓪ ⓪"⓪((* tests *)⓪ ⓪ PROCEDURE withShift (VAR s: SpecialKeySet): BOOLEAN;⓪ ⓪"BEGIN⓪$RETURN (leftShiftKey IN s) OR (rightShiftKey IN s)⓪"END withShift;⓪ ⓪ PROCEDURE withBothShifts (VAR s: SpecialKeySet): BOOLEAN;⓪ ⓪"BEGIN⓪$RETURN (leftShiftKey IN s) AND (rightShiftKey IN s)⓪"END withBothShifts;⓪ ⓪ PROCEDURE withCtrl (VAR s: SpecialKeySet): BOOLEAN;⓪ ⓪"BEGIN⓪$RETURN controlKey IN s⓪"END withCtrl;⓪ ⓪ PROCEDURE withAlt (VAR s: SpecialKeySet): BOOLEAN;⓪ ⓪"BEGIN⓪$RETURN alternateKey IN s⓪"END withAlt;⓪ ⓪"⓪((* procs for AES objects *)⓪(⓪ (* formDo -- Is same as 'FormDo', but clears the most significant bit⓪!* of 'exit' (double click).⓪!*)⓪!⓪ PROCEDURE formDo (tree: PtrObjTree; start: CARDINAL; VAR exit: CARDINAL);⓪ ⓪"BEGIN⓪$FormDo (tree, start, exit);⓪$exit := exit MOD (MaxCard DIV 2);⓪"END formDo;⓪"⓪ PROCEDURE drawObject (tree: PtrObjTree; obj: CARDINAL);⓪ ⓪"VAR space : Rectangle;⓪ ⓪"BEGIN⓪$space := AbsObjectSpace (tree, obj);⓪$DrawObject (tree, Root, MaxDepth, space);⓪"END drawObject;⓪"⓪ PROCEDURE hideObj (obj: CARDINAL; hide: BOOLEAN);⓪ ⓪"BEGIN⓪$SetObjFlag (CurrObjTree (), obj, hideTreeFlg, hide);⓪"END hideObj;⓪ ⓪"⓪0(* Operations on path/file names *)⓪ ⓪ (* IsSourceName -- Is TRUE, if 'path' descibes a source file else FALSE.⓪!*)⓪ ⓪ PROCEDURE IsSourceName (REF path: ARRAY OF CHAR): BOOLEAN;⓪ ⓪"VAR name : NameStr;⓪(prefix : ARRAY[0..64] OF CHAR;⓪(suffix : ARRAY[0..2] OF CHAR;⓪(sufcnt : MySuf;⓪(isSource: BOOLEAN;⓪(⓪"BEGIN⓪$SplitPath (path, prefix, name);⓪$SplitName (name, name, suffix);⓪$isSource := ~ Empty (suffix);⓪$IF isSource THEN⓪&sufcnt:= MIN (MySuf);⓪&LOOP⓪(IF StrEqual (suffix, suf[sufcnt]) THEN isSource := FALSE; EXIT⓪(ELSIF sufcnt = MAX (MySuf) THEN EXIT⓪(ELSE INC (sufcnt) END⓪&END;⓪$END;⓪$RETURN isSource⓪"END IsSourceName;⓪ ⓪ PROCEDURE isMSPFile (REF name: ARRAY OF CHAR): BOOLEAN;⓪"VAR n: ARRAY [0..11] OF CHAR;⓪"BEGIN⓪$SplitPath (name, void128, n);⓪$SplitName (n, void128, n);⓪$RETURN StrEqual (n, suf[m2p])⓪"END isMSPFile;⓪"⓪ PROCEDURE IsMBTFile (REF name: ARRAY OF CHAR): BOOLEAN;⓪"VAR n: ARRAY [0..11] OF CHAR;⓪"BEGIN⓪$SplitPath (name, void128, n);⓪$SplitName (n, void128, n);⓪$RETURN StrEqual (n, suf[m2b])⓪"END IsMBTFile;⓪"⓪ PROCEDURE isMakeFile (REF name: ARRAY OF CHAR): BOOLEAN;⓪"VAR n: ARRAY [0..11] OF CHAR;⓪"BEGIN⓪$SplitPath (name, void128, n);⓪$SplitName (n, void128, n);⓪$RETURN StrEqual (n, suf[m2m])⓪"END isMakeFile;⓪"⓪"⓪0(* Alerts *)⓪0(* ====== *)⓪ ⓪ PROCEDURE doAlert (alt: PtrMaxStr);⓪ ⓪"BEGIN⓪$FormAlert (1, alt^, voidC);⓪"END doAlert;⓪"⓪ ⓪ (* multiStringAlert -- Setzt aus den zwei Zeichenketten eine Alarmmeldung⓪!* zusammen und gibt diese aus.⓪!*)⓪ ⓪ PROCEDURE multiStringAlert (REF str1, str2: ARRAY OF CHAR; VAR but: CARDINAL);⓪ ⓪"VAR str : ARRAY[0..255] OF CHAR;⓪"⓪"BEGIN⓪$Concat (str1, str2, str, voidO);⓪$FormAlert (1, str, but);⓪"END multiStringAlert;⓪ ⓪ (* notOKAlert -- Falls die globale Variable 'ok = FALSE' ist, so wird der⓪!* übergebene FileStr 'str' innerhalb einer Alert-Box ange-⓪!* zeigt.⓪!*)⓪!⓪ PROCEDURE notOKAlert (str: PtrMaxStr);⓪ ⓪"BEGIN⓪$IF ~ ok THEN doAlert (str) END;⓪"END notOKAlert;⓪ ⓪ PROCEDURE flexAlert (default: CARDINAL; REF str1,str2:ARRAY OF CHAR; alt:PtrMaxStr;⓪5VAR but:CARDINAL);⓪5⓪"VAR str, strx : ARRAY[0..255] OF CHAR;⓪*i, j : INTEGER;⓪7⓪"BEGIN⓪$i:=Pos ('&',alt^, 0);⓪$j:=Pos ('&',alt^, i + 1);⓪$Copy (alt^, 0,i, str, voidO);⓪$Append (str1, str, voidO);⓪$IF j >= 0 THEN⓪&Copy (alt^, i + 1,j - i - 1, strx, voidO);⓪&Append (strx, str, voidO);⓪&Append (str2, str, voidO);⓪&i:=j;⓪$END;⓪$Copy (alt^, i + 1,Length (alt^) - CARDINAL (i) - 1, strx, voidO);⓪$Append (strx, str, voidO);⓪$FormAlert (default,str, but);⓪"END flexAlert;⓪"⓪ PROCEDURE reportOutOfMemory;⓪ ⓪"BEGIN⓪$doAlert (memFullAlt);⓪"END reportOutOfMemory;⓪ ⓪ ⓪8(* menu procs *)⓪8(* =========== *)⓪ ⓪ PROCEDURE InitWorkFieldMenuIndizies;⓪ ⓪"BEGIN⓪$WorkField.elems[0].index := Mwwork0;⓪$WorkField.elems[1].index := Mwwork1;⓪$WorkField.elems[2].index := Mwwork2;⓪$WorkField.elems[3].index := Mwwork3;⓪$WorkField.elems[4].index := Mwwork4;⓪$WorkField.elems[5].index := Mwwork5;⓪$WorkField.elems[6].index := Mwwork6;⓪$WorkField.elems[7].index := Mwwork7;⓪$WorkField.elems[8].index := Mwwork8;⓪$WorkField.elems[9].index := Mwwork9;⓪"END InitWorkFieldMenuIndizies;⓪"⓪"⓪ (* setTools -- Verändert den Menubaum so, daß nur noch die in 'ToolField'⓪!* vorhandenen Menu-Tool-Einträge sichtbar sind.⓪!*)⓪ ⓪ PROCEDURE setTools;⓪ ⓪"CONST toolNameLen = 12;⓪ ⓪"VAR f1, f2 : Rectangle;⓪(h : INTEGER;⓪(i : CARDINAL;⓪(str, str2 : FileStr;⓪"⓪"BEGIN⓪"⓪$SetCurrObjTree (menu, FALSE);⓪$h := 0;⓪$FOR i := 1 TO MaxTool DO⓪&WITH ToolField[i]⓪&DO⓪(IF used THEN⓪(⓪*GetTextString (menu, index, str);⓪*SplitPath (name, void128, str2);⓪*Append (Space (toolNameLen - Length (str2)), str2, voidO);⓪*Delete (str, 2, toolNameLen, voidO);⓪*Insert (str2, 2, str, voidO);⓪*MenuText (menu, index, str);⓪*f1 := ObjectSpace (index);⓪*h := h + f1.h⓪*⓪(END;⓪(hideObj (index, NOT used);⓪&END⓪$END;⓪$IF h = 0⓪$THEN⓪&IF NOT ObjectFlag (menu, Mtools, hideTreeFlg)⓪&THEN⓪(hideObj (Mtools, TRUE);⓪(f1 := ObjectSpace (Mibox);⓪(f2 := ObjectSpace (Mtools);⓪(DEC (f1.w, f2.w);⓪(SetObjSpace (Mibox, f1);⓪&END;⓪$ELSE⓪&IF ObjectFlag (menu, Mtools, hideTreeFlg) THEN⓪(hideObj (Mtools, FALSE);⓪(f1 := ObjectSpace (Mibox);⓪(f2 := ObjectSpace (Mtools);⓪(INC (f1.w, f2.w);⓪(SetObjSpace (Mibox, f1);⓪&END;⓪&f1 := ObjectSpace (Tibox);⓪&f1.h := h;⓪&SetObjSpace (Tibox, f1);⓪$END;⓪$⓪$MenuBar (menu, TRUE);⓪$⓪"END setTools;⓪ ⓪ ⓪ (* setWorkfiles -- Verändert den Menubaum so, daß nur noch die in 'WorkField'⓪!* vorhandenen Menu-Workfile-Einträge sichtbar sind.⓪!*)⓪ ⓪ PROCEDURE setWorkfiles;⓪ ⓪"CONST workNameLen = 12;⓪ ⓪"VAR i, lastIdx: INTEGER;⓪(str, str2 : FileStr;⓪(f1, f2 : Rectangle;⓪"⓪"BEGIN⓪$SetCurrObjTree (menu, FALSE);⓪$lastIdx := 0;⓪$FOR i := 0 TO maxWorkFiles - 1 DO⓪$⓪&WITH WorkField.elems[i]⓪&DO⓪(GetTextString (menu, index, str);⓪(IF used⓪(THEN⓪*lastIdx := i;⓪*SplitPath (sourceName, void128, str2);⓪(ELSE⓪*str2 := '';⓪(END;⓪(Append (Space (workNameLen - Length (str2)), str2, voidO);⓪(Delete (str, 2, workNameLen, voidO);⓪(Insert (str2, 2, str, voidO);⓪(MenuText (menu, index, str);⓪*⓪(SetObjStateElem (menu, index, disableObj, NOT used);⓪(CheckItem (menu, index, FALSE);⓪&END⓪&⓪$END;(*FOR*)⓪$⓪$(* Cause the work file number zero is the last in the pull down menu.⓪%*)⓪$IF WorkField.elems[0].used THEN lastIdx := 10 END;⓪$⓪$(* Hide all work file menu entries after the last used one.⓪%*)⓪$FOR i := 1 TO maxWorkFiles - 1⓪$DO⓪&hideObj (WorkField.elems[i].index, i > lastIdx);⓪$END;⓪$hideObj (WorkField.elems[0].index, 10 > lastIdx);⓪$⓪$(* Adjust size of the ibox, that contains the pull down menu.⓪%*)⓪$f1 := ObjectSpace (Wibox);⓪$f2 := ObjectSpace (Mwwork0);⓪$f1.h := lastIdx * f2.h + WorkField.baseHeightOfWibox;⓪$SetObjSpace (Wibox, f1);⓪$⓪$IF WorkField.current # noCurrentWorkfile⓪$THEN⓪&CheckItem (menu, WorkField.elems[WorkField.current].index, TRUE);⓪$END;⓪"END setWorkfiles;⓪ ⓪ ⓪ PROCEDURE animateMenuTitle (title: CARDINAL; VAR space: Rectangle);⓪ ⓪"BEGIN⓪$NormalTitle (menu, title, FALSE);⓪$space := AbsObjectSpace (menu, title);⓪"END animateMenuTitle;⓪ ⓪ PROCEDURE deAnimateMenuTitle (title: CARDINAL);⓪ ⓪"BEGIN⓪$NormalTitle (menu, title, TRUE);⓪"END deAnimateMenuTitle;⓪"⓪ ⓪0(* Routinen für das Dialogbox-Managment *)⓪0(* ==================================== *)⓪ ⓪((* misc. box primitives *)⓪ ⓪ TYPE arrayOfTwoCards = ARRAY[1..2] OF CARDINAL;⓪ ⓪ PROCEDURE twoCardsInArray (c1, c2: CARDINAL): arrayOfTwoCards;⓪ ⓪"VAR res: arrayOfTwoCards;⓪"⓪"BEGIN⓪$res[1] := c1;⓪$res[2] := c2;⓪$RETURN res⓪"END twoCardsInArray;⓪"⓪ ⓪((* box handlers *)⓪"⓪ PROCEDURE doCompilerOptionBox;⓪ ⓪"PROCEDURE setGetCompOpts (mode: SetGetMode);⓪"⓪$VAR notProtocol,⓪(found : BOOLEAN;⓪(fname : FileStr;⓪"⓪$BEGIN⓪&WITH CompilerParm DO⓪(SetGetBoxStr (optBox, Oname, mode, name);⓪(Upper (name);⓪(SetGetBoxState (optBox, Oquite, mode, checkObj, shortMsgs);⓪(SetGetBoxState (optBox, Opmark, mode, checkObj, protocol);⓪(IF mode = setValue THEN⓪*notProtocol := ~ protocol;⓪*SetGetBoxState (optBox, Oppath, setValue, disableObj, notProtocol);⓪*SetGetBoxState (optBox, Opwidth, setValue, disableObj, notProtocol);⓪(END;⓪(SetGetBoxStr (optBox, Oargs, mode, CompilerArgs);⓪(SetGetBoxStr (optBox, Oppath, mode, protName);⓪(SetGetBoxCard (optBox, Opwidth, mode, protWidth);⓪(IF protWidth < 10 THEN protWidth := stdProtWidth END;⓪(⓪(SetGetBoxStr (optBox, Ooutput, mode, MainOutputPath);⓪(ValidatePath (MainOutputPath);⓪(SetGetBoxStr (optBox, Olibrary, mode, DefLibName);⓪(IF mode = getValue THEN⓪*Upper (DefLibName);⓪*IF Length (FilePath (DefLibName)) = 0 THEN⓪,SearchFile (DefLibName, DefPaths, fromStart, found, DefLibName);⓪*END⓪(END;⓪(SetGetBoxStr (optBox, Oerror, mode, ErrListFile);⓪(Upper (ErrListFile);⓪&END;⓪$END setGetCompOpts;⓪$⓪ ⓪"VAR space, start : Rectangle;⓪(exit : CARDINAL;⓪"⓪"BEGIN⓪$animateMenuTitle (Mparms, start);⓪$⓪$setGetCompOpts (setValue);⓪$PrepareBox (optBox, start, space);⓪$⓪$LOOP⓪&formDo (optBox, Ooutput, exit);⓪&⓪&CASE exit OF⓪(Ook, Oquit: DeselectButton (optBox, exit); EXIT|⓪(Oquite : ToggleCheckBox (optBox, Oquite)|⓪(Opmark : ToggleCheckPlus (optBox, Opmark,⓪EtwoCardsInArray (Oppath, Opwidth))|⓪&ELSE⓪&END;⓪$END;⓪$⓪$IF exit = Ook THEN setGetCompOpts (getValue) END;⓪$⓪$ReleaseBox(optBox, start, space);⓪$deAnimateMenuTitle (Mparms);⓪"END doCompilerOptionBox;⓪ ⓪ PROCEDURE doLinkerOptionBox;⓪ ⓪"PROCEDURE setGetLinkOpts (mode: SetGetMode);⓪ ⓪$VAR i : CARDINAL;⓪(valid,⓪(notValid: BOOLEAN;⓪(refs : ARRAY [1..4] OF ObjEnumRef;⓪$⓪$BEGIN⓪&SetGetBoxStr (linkBox, Loname, mode, LinkerParm.name);⓪&Upper (LinkerParm.name);⓪&FOR i:= 1 TO 8 DO⓪(WITH linkBoxIdx[i] DO⓪*SetGetBoxState (linkBox, check, mode, checkObj, LinkerParm.linkList[i].valid);⓪*IF mode = setValue THEN⓪,notValid := ~ LinkerParm.linkList[i].valid;⓪,SetGetBoxState (linkBox, path, setValue, disableObj, notValid);⓪*END;⓪*SetGetBoxStr (linkBox, path, mode, LinkerParm.linkList[i].name);⓪(END⓪&END;⓪&valid := (LinkerParm.linkStackSize # 0L); notValid := ~ valid;⓪&SetGetBoxState (linkBox, Lochecks, mode, checkObj, valid);⓪&IF mode = setValue THEN⓪(SetGetBoxState (linkBox, Lostack, setValue, disableObj, notValid);⓪&END;⓪&SetGetBoxLCard (linkBox, Lostack, mode, LinkerParm.linkStackSize);⓪&IF ~ valid THEN LinkerParm.linkStackSize := 0L END;⓪&SetGetBoxCard (linkBox, Lomaxmod, mode, LinkerParm.maxLinkMod);⓪&⓪&SetGetBoxState (linkBox, Lofastld, mode, checkObj, LinkerParm.fastLoad);⓪&SetGetBoxState (linkBox, Lofastco, mode, checkObj, LinkerParm.fastCode);⓪&SetGetBoxState (linkBox, Lofastme, mode, checkObj, LinkerParm.fastMemory);⓪&⓪&SetGetBoxState (linkBox, Losymfil, mode, checkObj, LinkerParm.symbolFile);⓪&⓪&refs[1].obj := Lonoopt;⓪&refs[1].value := WORD (noOptimize);⓪&refs[2].obj := Lonamopt;⓪&refs[2].value := WORD (nameOptimize);⓪&refs[3].obj := Lomiddle;⓪&refs[3].value := WORD (partOptimize);⓪&refs[4].obj := Lofull;⓪&refs[4].value := WORD (fullOptimize);⓪&i := ORD (LinkerParm.optimize);⓪&SetGetBoxEnum (linkBox, refs, mode, i);⓪&LinkerParm.optimize := VAL (LinkMode, i);⓪$END setGetLinkOpts;⓪$⓪ ⓪"VAR space, start : Rectangle;⓪(exit, i : CARDINAL;⓪"⓪"BEGIN⓪$animateMenuTitle (Mparms, start);⓪$⓪$setGetLinkOpts (setValue);⓪$PrepareBox (linkBox, start, space);⓪$⓪$LOOP⓪&formDo (linkBox, Root, exit);⓪&⓪&IF (exit = Look) OR (exit = Loquit) THEN⓪(DeselectButton (linkBox, exit); EXIT⓪&ELSIF exit = Lochecks THEN⓪(ToggleCheckPlus (linkBox, Lochecks, Lostack)⓪&ELSIF (exit = Lofastld) OR (exit = Lofastco) OR (exit = Lofastme)⓪&OR (exit = Losymfil) THEN⓪(ToggleCheckBox (linkBox, exit)⓪&ELSE⓪(FOR i := 1 TO 8 DO⓪*IF linkBoxIdx[i].check = exit THEN⓪,ToggleCheckPlus (linkBox, exit, linkBoxIdx[i].path)⓪*END⓪(END;⓪&END;⓪$END;⓪$⓪$IF exit = Look THEN setGetLinkOpts (getValue) END;⓪"⓪$ReleaseBox(linkBox, start,space);⓪$deAnimateMenuTitle (Mparms);⓪"END doLinkerOptionBox;⓪"⓪ PROCEDURE doScanBox (): BOOLEAN;⓪ ⓪"VAR but : CARDINAL;⓪"⓪"BEGIN⓪$ScanAddr := 0L;⓪$SetTextString (scanBox, Saddr, '');⓪$DoSimpleBox (scanBox, Rect (-1, -1, -1, -1), but);⓪$IF but = Sok THEN SetGetBoxLCard (scanBox, Saddr, getValue, ScanAddr) END;⓪$RETURN ScanAddr # 0L⓪"END doScanBox;⓪ ⓪ FORWARD setWorkfileName (idx: CARDINAL; VAR name: ARRAY OF CHAR);⓪ ⓪ (* doChangeWork -- Inquires a file name from the user, that becomes the new⓪!* work file number 'idx'.⓪!* 'idx' has to be an active work file.⓪!*)⓪ ⓪ PROCEDURE doChangeWork (idx: INTEGER);⓪ ⓪"VAR str : FileStr;⓪*ok : BOOLEAN;⓪"⓪"BEGIN⓪$animateMenuTitle (Mworkfil, voidFrame);⓪"⓪$str := WorkField.elems[idx].sourceName;⓪$SelectFile (changeWorkTitle^, str, ok);⓪$⓪$IF ok⓪$THEN⓪&Upper (str);⓪&setWorkfileName (idx, str);⓪$END;⓪$⓪$deAnimateMenuTitle (Mworkfil);⓪"END doChangeWork;⓪ ⓪ PROCEDURE doShellParameterBox;⓪ ⓪"PROCEDURE setGetShellParm (mode: SetGetMode);⓪"⓪$BEGIN⓪&WITH shellParm DO⓪(SetGetBoxState (shellParmBox, Spbreak, mode, checkObj, breakActive);⓪(SetGetBoxStr (shellParmBox, Spbaname, mode, batchPath);⓪(Upper (batchPath);⓪(SetGetBoxStr (shellParmBox, Sppaname, mode, parameterPath);⓪(Upper (parameterPath);⓪(SetGetBoxStr (shellParmBox, Spscpath, mode, TemporaryPath);⓪(ValidatePath (TemporaryPath);⓪(IF TemporaryPath[0] # HomeSymbol THEN⓪*MakeFullPath (TemporaryPath, voidI);⓪(END;⓪(SetGetBoxStr (shellParmBox, Spmake, mode, makeName);⓪(Upper (makeName);⓪&END;⓪$END setGetShellParm;⓪$⓪"VAR space, start : Rectangle;⓪(exit : CARDINAL;⓪"⓪"BEGIN⓪$animateMenuTitle (Mparms, start);⓪$⓪$setGetShellParm (setValue);⓪$PrepareBox (shellParmBox, start, space);⓪$⓪$LOOP⓪&formDo (shellParmBox, Root, exit);⓪&⓪&CASE exit OF⓪(Spok, Spquit: DeselectButton (shellParmBox, exit); EXIT|⓪(⓪(Spbreak : ToggleCheckBox (shellParmBox, exit)|⓪&ELSE⓪&END;⓪$END;⓪$⓪$IF exit = Spok THEN setGetShellParm (getValue) END;⓪$⓪$ReleaseBox(shellParmBox, start, space);⓪$deAnimateMenuTitle (Mparms);⓪"END doShellParameterBox;⓪ ⓪ PROCEDURE doEditorParameterBox;⓪ ⓪"PROCEDURE setGetEditorParm (mode: SetGetMode);⓪"⓪$VAR disable: BOOLEAN;⓪"⓪$BEGIN⓪&WITH EditorParm DO⓪(SetGetBoxStr (editorParmBox, Epname, mode, name);⓪(Upper (name);⓪(SetGetBoxState (editorParmBox, Epsearch, mode,⓪8checkObj, searchSources);⓪(SetGetBoxState (editorParmBox, Epstoper, mode,⓪8checkObj, waitOnError);⓪(SetGetBoxState (editorParmBox, Epshtemp, mode,⓪8checkObj, tempShellFile);⓪(disable := ~ tempShellFile;⓪(SetGetBoxState (editorParmBox, Epshname, mode, disableObj, disable);⓪(SetGetBoxStr (editorParmBox, Epshname, mode, tempShellName);⓪(⓪(SetGetBoxState (editorParmBox, Epedtemp, mode,⓪8checkObj, tempEditorFile);⓪(disable := ~ tempEditorFile;⓪(SetGetBoxState (editorParmBox, Epedname, mode, disableObj, disable);⓪(SetGetBoxStr (editorParmBox, Epedname, mode, tempEditorName);⓪ ⓪(SetGetBoxState (editorParmBox, Eparg, mode,⓪8checkObj, passArgument);⓪(SetGetBoxState (editorParmBox, Eparname, mode,⓪8checkObj, passName);⓪(SetGetBoxState (editorParmBox, Eparerro, mode,⓪8checkObj, passErrorText);⓪(SetGetBoxState (editorParmBox, Eparpos, mode,⓪8checkObj, passErrorPos);⓪&END;⓪$END setGetEditorParm;⓪$⓪"VAR start, space: Rectangle;⓪(exit : CARDINAL;⓪ ⓪"BEGIN⓪$animateMenuTitle (Mparms, start);⓪$⓪$setGetEditorParm (setValue);⓪$PrepareBox (editorParmBox, start, space);⓪$⓪$LOOP⓪&formDo (editorParmBox, Root, exit);⓪&⓪&CASE exit OF⓪(Epok, Epquit: DeselectButton (editorParmBox, exit); EXIT|⓪(⓪(Epsearch,⓪(Epstoper,⓪(Eparg,⓪(Eparname,⓪(Eparerro,⓪(Eparpos : ToggleCheckBox (editorParmBox, exit)|⓪(Epshtemp : ToggleCheckPlus (editorParmBox, Epshtemp, Epshname)|⓪(Epedtemp : ToggleCheckPlus (editorParmBox, Epedtemp, Epedname)|⓪&ELSE⓪&END;⓪$END;⓪$⓪$IF exit = Epok THEN setGetEditorParm (getValue) END;⓪"⓪$ReleaseBox(editorParmBox, start, space);⓪$deAnimateMenuTitle (Mparms);⓪"END doEditorParameterBox;⓪"⓪ PROCEDURE doHelpBox (REF fname: ARRAY OF CHAR);⓪ ⓪"CONST noLines = 14; (* Anzahl der Zeilen in der Hilfe-Box *)⓪(noRows = 65;⓪ ⓪"VAR start, space : Rectangle;⓪(but, i,⓪(visibleLines : CARDINAL;⓪(text : List;⓪(err, end, first : BOOLEAN;⓪(f : File;⓪(str : ptrString;⓪(path : PathStr;⓪ ⓪"PROCEDURE fileErr (): BOOLEAN;⓪$VAR state: INTEGER;⓪$BEGIN⓪&state := State (f);⓪&IF (state < fOK) OR (state = fEOF) THEN⓪)ResetState (f);⓪)FileAlert (state);⓪)RETURN TRUE⓪&ELSE⓪)RETURN FALSE⓪&END;⓪$END fileErr;⓪$⓪"PROCEDURE addLine (obj: CARDINAL);⓪$BEGIN⓪&IF NOT end THEN⓪(str := NextEntry (text);⓪(IF str = NIL THEN end := TRUE ELSE INC (visibleLines) END;⓪&END;⓪&IF end THEN⓪(SetTextString (helpBox, obj, '')⓪&ELSE⓪(IF Length (str^) > noRows THEN⓪*Delete (str^, noRows, Length (str^) - noRows, voidO);⓪(END;⓪(SetTextString (helpBox, obj, str^);⓪&END;⓪$END addLine;⓪$⓪"BEGIN⓪$animateMenuTitle (Mparms, start);⓪$⓪$(* Lies Hilfe-Datei ein.⓪%*)⓪ ⓪$Concat (ShellPath, fname, path, voidO);⓪$CreateList (text, err);⓪$IF err THEN reportOutOfMemory; deAnimateMenuTitle (Mparms); RETURN END;⓪$ShowBee;⓪$Open (f, path, readSeqTxt);⓪$IF (State (f)) # fOK⓪$THEN⓪&doAlert (noHelpAlt); ⓪&DeleteList (text, voidO);⓪&deAnimateMenuTitle (Mparms);⓪&ShowArrow;⓪&RETURN⓪$END;⓪$LOOP⓪$⓪&NEW (str);⓪&IF str = NIL THEN reportOutOfMemory; EXIT END;⓪&IF fileErr () THEN DISPOSE (str); EXIT END;⓪&Text.ReadString (f, str^);⓪$ AppendEntry (text, str, err);⓪&IF err THEN reportOutOfMemory; DISPOSE (str); EXIT END;⓪&IF fileErr () THEN EXIT END;⓪&Text.ReadLn (f);⓪$⓪$END;⓪$Close (f);⓪$ShowArrow;⓪$⓪$(* Zeige Hilfe-Datei an.⓪%*)⓪%⓪$ResetList (text);⓪$but := Hpnext; visibleLines := 0; first := TRUE;⓪$REPEAT⓪$⓪&IF but = Hpprev THEN⓪(IF EndOfList (text) THEN INC (visibleLines) END;⓪(FOR i := 1 TO noLines + visibleLines DO voidADR := PrevEntry (text) END;⓪&END;⓪&SetObjStateElem (helpBox, Hpprev, disableObj, EndOfList (text));⓪&end := FALSE; visibleLines := 0;⓪&addLine (Hpmsg1); addLine (Hpmsg2); addLine (Hpmsg3);⓪&addLine (Hpmsg4); addLine (Hpmsg5); addLine (Hpmsg6);⓪&addLine (Hpmsg7); addLine (Hpmsg8); addLine (Hpmsg9);⓪&addLine (Hpmsg10); addLine (Hpmsg11); addLine (Hpmsg12);⓪&addLine (Hpmsg13); addLine (Hpmsg14);⓪&SetObjStateElem (helpBox, Hpnext, disableObj, EndOfList (text));⓪&SetObjFlag (helpBox, Hpnext, defaultFlg, NOT EndOfList (text));⓪&SetObjFlag (helpBox, Hpquit, defaultFlg, EndOfList (text));⓪&⓪&IF first THEN PrepareBox (helpBox, start, space); first := FALSE⓪&ELSE DrawObject (helpBox, Root, MaxDepth, space) END;⓪&formDo (helpBox, Root, but);⓪&DeselectButton (helpBox, but);⓪&⓪$UNTIL but = Hpquit;⓪$ReleaseBox (helpBox, start, space);⓪$⓪$(* Lösche Hilfe-Datei.⓪%*)⓪$deleteSimpleList (text, TRUE);⓪$⓪$deAnimateMenuTitle (Mparms);⓪"END doHelpBox;⓪ ⓪ ⓪ PROCEDURE doInfoBox;⓪ ⓪ (*⓪!* Umgebungsinformationen⓪!*)⓪ ⓪"VAR dftPath,⓪(codeFile : FileStr;⓪(dftPathEditable : BOOLEAN;⓪(⓪"PROCEDURE setGetInfo (mode: SetGetMode);⓪"⓪$VAR lc: LONGCARD; s: ARRAY [0..13] OF CHAR;⓪"⓪$BEGIN⓪&SetObjFlag (infoBox, Inpath, editFlg, dftPathEditable);⓪&SetGetBoxStr (infoBox, Inpath, mode, dftPath);⓪&SetGetBoxLCard (infoBox, Instack, mode, DefaultStackSize);⓪&SetGetBoxStr (infoBox, Inmkfile, mode, MakeFileName);⓪&SetGetBoxState (infoBox, Stponrtn, mode, checkObj, shellParm.waitOnReturn);⓪&Upper (MakeFileName);⓪&IF mode = setValue THEN⓪(lc := MemAvail ();⓪(SetGetBoxLCard (infoBox, Inblock, setValue, lc);⓪(lc := AllAvail ();⓪(SetGetBoxLCard (infoBox, Inall, setValue, lc);⓪(SetGetBoxStr (infoBox, Ihome, setValue, HomePath);⓪(SetGetBoxStr (infoBox, Incode, setValue, codeFile);⓪(SetGetBoxLCard (infoBox, Inlength, setValue, LastCodeSize);⓪(IF UsedFormat = IEEEReal THEN⓪*IF RealMode = 2 THEN⓪,s:= 'IEEE (ST-FPU)'⓪*ELSE⓪,s:= 'IEEE (TT-FPU)'⓪*END⓪(ELSE⓪*s:= 'Megamax'⓪(END;⓪(SetGetBoxStr (infoBox, Realform, setValue, s);⓪&END;⓪$END setGetInfo;⓪$⓪"VAR space, start : Rectangle;⓪(exit : CARDINAL;⓪(res : INTEGER;⓪ ⓪"BEGIN⓪$animateMenuTitle (Mparms, start);⓪$⓪$GetDefaultPath (dftPath);⓪$dftPathEditable := (maxDftPathInfo >= Length (dftPath));⓪$truncCopyString (dftPath, maxDftPathInfo, dftPath);⓪$truncCopyString (LastCodeName, maxCodeFileInfo, codeFile);⓪$setGetInfo (setValue);⓪$⓪$PrepareBox (infoBox, start, space);⓪$LOOP⓪&formDo (infoBox, Root, exit);⓪&CASE exit OF⓪(Inok, Inquit: DeselectButton (infoBox, exit); EXIT|⓪(Stponrtn : ToggleCheckBox (infoBox, exit)|⓪&ELSE⓪&END;⓪$END;⓪$ReleaseBox(infoBox, start, space);⓪$⓪$IF exit = Inok THEN⓪&setGetInfo (getValue);⓪&IF dftPathEditable THEN⓪(ValidatePath (dftPath);⓪(ReplaceHome (dftPath);⓪(SetDefaultPath (dftPath, res);⓪(FileAlert (res);⓪&END;⓪$END;⓪$deAnimateMenuTitle (Mparms);⓪"END doInfoBox;⓪"⓪ ⓪0(* Exportierte Box-Funktionen *)⓪ ⓪ PROCEDURE ScanBox (VAR name: ARRAY OF CHAR): BOOLEAN;⓪ ⓪"VAR but: CARDINAL;⓪ ⓪"BEGIN⓪$SetTextString (sNameBox, Snedit, name);⓪$DoSimpleBox (sNameBox, Rect (-1, -1, -1, -1), but);⓪$CASE but OF⓪&Snok : GetTextString(sNameBox, Snedit, name); Upper (name)|⓪&Snwork: WITH WorkField DO⓪0IF current >= 0⓪0THEN Assign(elems[current].sourceName, name, voidO)⓪0ELSE Assign ('', name, voidO); END;⓪.END|⓪$ELSE⓪$END;⓪$RETURN but # Snquit⓪"END ScanBox;⓪ ⓪ PROCEDURE RequestArg (VAR name: ARRAY OF CHAR);⓪ ⓪"BEGIN⓪$SetTextString (argBox, Aedit, name);⓪$DoSimpleBox (argBox, Rect (0, 0, 50, 30), voidC);⓪$GetTextString (argBox, Aedit, name);⓪"END RequestArg;⓪ ⓪ TYPE TellMode = (initTell, newTellValue, endTell);⓪ ⓪ PROCEDURE TellLoading (mode: TellMode; REF fname: ARRAY OF CHAR);⓪ ⓪"VAR start : Rectangle;⓪"⓪"BEGIN⓪$start := Rect (0, 0, 50, 30);⓪$⓪$CASE mode OF⓪&initTell : SetTextString (loadBox, Lfname, '');⓪<PrepareBox (loadBox, start, tellSpace);⓪<ShowBee|⓪<⓪&newTellValue : SetTextString (loadBox, Lfname, ' ');⓪<drawObject (loadBox, Lfname);⓪<SetTextString (loadBox, Lfname, FileName (fname));⓪<drawObject (loadBox, Lfname)|⓪<⓪&endTell : ReleaseBox (loadBox, start, tellSpace);⓪<ShowArrow|⓪$END;⓪"END TellLoading;⓪ ⓪"⓪ ⓪8(* misc. II *)⓪8(* ======== *)⓪ ⓪ PROCEDURE enableAndDisableMenuItems;⓪ ⓪"VAR workSelected: BOOLEAN;⓪ ⓪"BEGIN⓪$EnableItem (menu, Mwnew, WorkField.noUsed < maxWorkFiles);⓪$workSelected := (WorkField.current # noCurrentWorkfile);⓪$EnableItem (menu, Mwdelete, workSelected);⓪$EnableItem (menu, Mwchange, workSelected);⓪$EnableItem (menu, Mdeditwo, workSelected);⓪$EnableItem (menu, Mdcompwo, workSelected);⓪$EnableItem (menu, Mdexecwo, workSelected);⓪$EnableItem (menu, Mdlinkwo, workSelected);⓪$EnableItem (menu, Mdscanwo, workSelected);⓪"END enableAndDisableMenuItems;⓪ ⓪ ⓪0(* Arbeitende Routinen *)⓪0(* =================== *)⓪ ⓪ FORWARD HideSS (complete: BOOLEAN);⓪ FORWARD ShowSS (isCompleteHidden: BOOLEAN);⓪ ⓪ ⓪ (* setWorkfileName -- Assigns the specified workfile a new name.⓪!*)⓪ ⓪ PROCEDURE setWorkfileName (idx: CARDINAL; VAR name: ARRAY OF CHAR);⓪ ⓪"BEGIN⓪$Upper (name);⓪$WITH WorkField.elems[idx]⓪$DO⓪&Assign (name, sourceName, voidO);⓪&codeName := '';⓪$END;⓪$⓪$setWorkfiles;⓪"END setWorkfileName;⓪"⓪"⓪ (* selectWorkfile -- Selects another work file object. Only used slots would⓪!* be selected.⓪!*)⓪!⓪ PROCEDURE selectWorkfile (i: INTEGER);⓪ ⓪"BEGIN⓪$WITH WorkField DO⓪$⓪&(* Remove check mark at old curr. work file.⓪'*)⓪&IF WorkField.current # noCurrentWorkfile⓪&THEN⓪(CheckItem (menu, elems[current].index, FALSE);⓪&END;⓪&⓪&(* Set new work file, if it is used.⓪'*)⓪&IF ~ WorkField.elems[i].used THEN i := noCurrentWorkfile END;⓪&WorkField.current := i;⓪&⓪&(* Set check mark at new curr. work file.⓪'*)⓪&IF WorkField.current # noCurrentWorkfile⓪&THEN⓪(CheckItem (menu, elems[current].index, TRUE);⓪&END;⓪$⓪$END;(*WITH*)⓪"END selectWorkfile;⓪ ⓪ (* makeNewWorkfile -- Tries to make another work file object.⓪!*)⓪!⓪ PROCEDURE makeNewWorkfile;⓪ ⓪"VAR i : CARDINAL;⓪(str : FileStr;⓪(ok : BOOLEAN;⓪(⓪"BEGIN⓪$animateMenuTitle (Mworkfil, voidFrame);⓪$⓪$(* find free slot.⓪%*)⓪$(* wir wollen mit Nr. 1 anfangen, erst nach Nr. 9 soll Nr. 0 kommen *)⓪$i := 1;⓪$WHILE (i <= maxWorkFiles) AND WorkField.elems[i MOD 10].used DO INC (i) END;⓪$IF i = 10 THEN i:= 0 END;⓪$⓪$IF i < maxWorkFiles THEN (* if found, then init. slot *)⓪$⓪&str := '';⓪&SelectFile (newWorkTitle^, str, ok);⓪&⓪&IF ok THEN⓪&⓪(SearchFile (str, SrcPaths, fromStart, voidO, str);⓪(INC (WorkField.noUsed);⓪(WorkField.elems[i].used := TRUE;⓪(setWorkfileName (i, str);⓪(selectWorkfile (i);⓪(⓪&END;⓪&⓪$ELSE⓪&doAlert (noNewWorkAlt)⓪$END;⓪$⓪$deAnimateMenuTitle (Mworkfil);⓪"END makeNewWorkfile;⓪ ⓪ (* killWorkfile -- Releases the current workfile object.⓪!*)⓪ ⓪ PROCEDURE killWorkfile;⓪ ⓪"BEGIN⓪$animateMenuTitle (Mworkfil, voidFrame);⓪$⓪$WITH WorkField DO⓪&IF current # noCurrentWorkfile THEN⓪&⓪(DEC (noUsed);⓪(elems[current].used := FALSE;⓪(elems[current].sourceName := '';⓪(current := noCurrentWorkfile;⓪(setWorkfiles; (* Correct menu tree *)⓪(⓪&END;⓪$END;⓪&⓪$deAnimateMenuTitle (Mworkfil);⓪"END killWorkfile;⓪#⓪ PROCEDURE saveParameter;⓪ ⓪"VAR but: CARDINAL;⓪ ⓪"BEGIN⓪$FormAlert (1, parmSaveAlt^, but);⓪$IF but = 1 THEN SaveParameter END;⓪"END saveParameter;⓪ ⓪ (* actManager -- Prepares the shell to execute a shell action and then calls⓪!* the 'action' procedure in the outer module.⓪!*⓪!* 'obj' -- Desktop object associated with the desired⓪!* action.⓪!* 'specials' -- Special keys pressed at action selection time.⓪!* 'work' -- Parameter of the action is a work file?⓪!* 'tool' -- Is a executed file a tool? (to set the correct⓪!* path in 'call')⓪!* 'alsoExec' -- Also excecute code after compilation?⓪!* 'noSelect' -- Don't call file slector box.⓪!*)⓪"⓪ PROCEDURE actManager (obj : CARDINAL;⓪6specials: SpecialKeySet;⓪5 work,⓪6tool,⓪6alsoExec,⓪6noSelect: BOOLEAN);⓪ ⓪"PROCEDURE assignMsg (VAR name: ARRAY OF CHAR);⓪"⓪$BEGIN⓪&truncCopyString (name, msgStrLen, msgStr);⓪$END assignMsg;⓪$⓪"PROCEDURE setSourceCurrFnAndMsg;⓪"⓪$BEGIN⓪$⓪&IF ~ work AND Empty (currFn)THEN⓪(currFn := lastFn;⓪&END;⓪&⓪&IF work THEN⓪(WITH WorkField DO⓪*IF current >= 0 THEN assignMsg (elems[current].sourceName)⓪*ELSE msgStr := '' END;⓪(END;⓪&ELSE assignMsg (currFn) END;⓪&⓪$END setSourceCurrFnAndMsg;⓪$⓪"PROCEDURE setCodeCurrFnAndMsg;⓪"⓪$BEGIN⓪$⓪&IF ~ work AND Empty (currFn) THEN⓪(currFn := CodeName;⓪&END;⓪&⓪&IF work THEN⓪(WITH WorkField DO⓪*IF current # noCurrentWorkfile THEN⓪,assignMsg (elems[current].codeName)⓪*ELSE msgStr := '' END;⓪(END;⓪&ELSE assignMsg (currFn) END;⓪&⓪$END setCodeCurrFnAndMsg;⓪"⓪"TYPE testProc = PROCEDURE (REF (* name: *) ARRAY OF CHAR): BOOLEAN;⓪$⓪"PROCEDURE testWorkAndCurrFn ((*$Z-*)test: testProc(*$Z=*)): BOOLEAN;⓪"⓪$BEGIN⓪&WITH WorkField DO⓪(IF work AND (current = noCurrentWorkfile) THEN RETURN FALSE⓪(ELSE⓪*RETURN (work AND test (elems[current].sourceName)) OR test (currFn)⓪(END;⓪&END;⓪$END testWorkAndCurrFn;⓪"⓪"⓪"VAR ok: BOOLEAN;⓪"⓪"PROCEDURE ifNotWorkThenSelectFile (title: PtrMaxStr; source: BOOLEAN);⓪"⓪$BEGIN⓪&ok := TRUE;⓪&IF NOT work AND NOT noSelect⓪&THEN⓪(IF source THEN currFn := lastFn ELSE currFn := CodeName END;⓪(SelectFile (title^, currFn, ok);⓪&END;⓪$END ifNotWorkThenSelectFile;⓪$⓪$⓪"BEGIN⓪$CASE obj OF⓪&Compile : IF alsoExec THEN ifNotWorkThenSelectFile (compExecTitle, TRUE);⓪1ELSE ifNotWorkThenSelectFile (compileTitle, TRUE) END;⓪1IF NOT ok THEN RETURN END;⓪1setSourceCurrFnAndMsg;⓪1IF testWorkAndCurrFn (isMakeFile) THEN⓪3IF alsoExec THEN action (doMkEx, work, tool)⓪3ELSE action (doMake, work, tool) END;⓪1ELSE⓪3IF alsoExec THEN action (doCpEx, work, tool)⓪3ELSE action (doComp, work, tool) END;⓪1END|⓪&Edit : ifNotWorkThenSelectFile (editTitle, TRUE);⓪1IF NOT ok THEN RETURN END;⓪1setSourceCurrFnAndMsg; action (doEdit, work, tool)|⓪&Execute : ifNotWorkThenSelectFile (executeTitle, FALSE);⓪1IF NOT ok THEN RETURN END;⓪1setCodeCurrFnAndMsg;⓪1Assign (lastFn, TextName, voidO);⓪1IF NOT work AND IsSourceName (currFn) THEN⓪3assignMsg (currFn);⓪3action (doExec, work, tool);⓪1ELSE⓪3IF testWorkAndCurrFn (IsMBTFile) (* exec. Batch-File *) THEN⓪5action (doBtch, work, tool);⓪3ELSIF testWorkAndCurrFn (isMSPFile) (* exec. Parm.-File *) THEN⓪5action (doParm, work, tool);⓪3ELSIF testWorkAndCurrFn (isMakeFile)(* exec. Make-File *) THEN⓪5action (doMkEx, work, tool);⓪3ELSE (* exec. norm. code *)⓪5IF withShift (specials) THEN⓪7RequestArg (lastArgs);⓪7args := lastArgs;⓪5ELSE⓪7args := '';⓪5END;⓪5noDirChange := withAlt (specials);⓪5action (doExec, work, tool);⓪5noDirChange := FALSE;⓪3END;⓪1END;⓪1Assign (TextName, lastFn, voidO)|⓪&Link : ifNotWorkThenSelectFile (linkTitle, FALSE);⓪1IF NOT ok THEN RETURN END;⓪1setCodeCurrFnAndMsg; action (doLink, work, tool)|⓪&⓪&Scan : ifNotWorkThenSelectFile (scanTitle, TRUE);⓪1IF NOT ok THEN RETURN END;⓪1setSourceCurrFnAndMsg;⓪1IF (ChainDepth < 0) OR ~ withShift (specials)⓪1THEN⓪3IF doScanBox () THEN⓪5action (doScan, work, tool);⓪3END;⓪1ELSE msgStr := ''; action (doCont, TRUE, tool) END|⓪ (*⓪&Resident : setCodeCurrFnAndMsg;⓪1HideSS (FALSE);⓪1TellLoading (initTell, '');⓪1action (doLoad, FALSE, tool);⓪1TellLoading (endTell, '');⓪1ShowSS (FALSE)|⓪ *)⓪$ELSE⓪$END;⓪"END actManager;⓪9⓪ PROCEDURE executeTool (i: CARDINAL; specials: SpecialKeySet);⓪ ⓪"VAR code: FileStr;⓪ ⓪"BEGIN⓪$IF ToolField[i].used AND NOT Empty (ToolField[i].name) THEN⓪&currFn := ToolField[i].name;⓪&code := CodeName; (* Akt. Code-Datei retten *)⓪&actManager (Execute, specials, FALSE, TRUE, FALSE, TRUE);⓪&CodeName := code; (* Akt. Code-Datei wiederherstellen *)⓪$END;⓪"END executeTool;⓪ ⓪ PROCEDURE editDocu (specials: SpecialKeySet);⓪ ⓪"VAR oldText, oldLast: FileStr;⓪"⓪"BEGIN⓪$animateMenuTitle (Mparms, voidFrame);⓪$⓪$ConcatName (shellParm.parameterPath, suf[m2d], currFn);⓪$oldText := TextName;⓪$oldLast := lastFn;⓪$actManager (Edit, specials, FALSE, FALSE, FALSE, TRUE);⓪$TextName := oldText;⓪$lastFn := oldLast;⓪$⓪$deAnimateMenuTitle (Mparms);⓪"END editDocu;⓪ ⓪ PROCEDURE makeFolder;⓪ ⓪"VAR ok : BOOLEAN;⓪(name : FileStr;⓪(result : INTEGER;⓪ ⓪"BEGIN⓪$name:= '';⓪$SelectFile (folderTitle^, name, ok);⓪$IF ok & NOT Empty (FileName (name)) THEN⓪&CreateDir (name, result); FileAlert (result);⓪$END;⓪"END makeFolder;⓪ ⓪ PROCEDURE deleteFile;⓪ ⓪"VAR ok : BOOLEAN;⓪(name : FileStr;⓪(result : INTEGER;⓪ ⓪"BEGIN⓪$name:= '';⓪$SelectFile (deleteTitle^, name, ok);⓪$IF ok & NOT Empty (FileName (name)) THEN⓪&Directory.Delete (name, result); FileAlert (result);⓪$END;⓪"END deleteFile;⓪ ⓪ ⓪0(* Routinen zur De-/Aktivierung der ShellShell *)⓪0(* =========================================== *)⓪"⓪ PROCEDURE ClearDeskAndShowMsg;⓪ ⓪"BEGIN⓪$MenuBar (NIL, FALSE);⓪$IF NOT multiGEM & NOT multiTOS THEN⓪&(* unter MultiGEM nichts in Menüleise zeichnen *)⓪&DrawObject (msgBar, Root, MaxDepth, ObjectSpaceWithAttrs (msgBar, Root));⓪$END;⓪$FormDial (freeForm, Rect (0, 0, 0, 0), deskSize);⓪"END ClearDeskAndShowMsg;⓪ ⓪ PROCEDURE ShowSS (isCompleteHidden: BOOLEAN);⓪ ⓪"VAR i : INTEGER;⓪(name: NameStr;⓪ ⓪"BEGIN⓪$IF isCompleteHidden THEN⓪$⓪&SetCurrGemHandle (gemHdl, ok);⓪&IF ~ ok THEN HALT; TermProcess (-1) END;⓪&⓪&setTools;⓪&setWorkfiles;⓪&MouseInput (TRUE);⓪&⓪&ShowArrow;⓪&IF ~multiTOS THEN SetNewDesk (NIL, Root); END;⓪&MenuBar (menu, TRUE);⓪&⓪&FormDial (freeForm, Rect (0, 0, 0, 0), deskSize);⓪&⓪$END;⓪"END ShowSS;⓪"⓪ ⓪ PROCEDURE InitSS (): BOOLEAN;⓪ ⓪"VAR mayLoad, success : BOOLEAN;⓪*devParm : PtrDevParm;⓪*space, f: Rectangle;⓪*x, w : INTEGER;⓪*eventmsg: MessageBuffer;⓪*mouseloc: Point;⓪*buttons: MButtonSet;⓪*keystate: SpecialKeySet;⓪*key: GemChar;⓪*clicks: CARDINAL;⓪*events: EventSet;⓪ ⓪"BEGIN⓪$IF MemAvail () < minNecessaryMem THEN RETURN FALSE END;⓪$⓪$InitGem (RC,dev, success);⓪$IF ~ success THEN⓪&IF GemActive () THEN⓪(multiStringAlert (noGemAlt1,noGemAlt2, voidC);⓪&END;⓪&RETURN FALSE⓪$ELSE⓪&gemHdl:=CurrGemHandle ();⓪$END;⓪$ShellPath:= HomePath;⓪$⓪$GEMBase.GetPBs (gemHdl, vdiPB, aesPB);⓪$multiGEM:= aesPB.pglobal^.count > 1;⓪$multiTOS:= aesPB.pglobal^.count = -1;⓪$⓪$deskSize := DeskSize ();⓪$CharSize (dev, charWidth, charHeight);⓪$⓪2(* Resource laden und Baumadressen ermitteln *)⓪2⓪$LoadResource (resourceFile);⓪$IF GemError () THEN⓪&multiStringAlert (noRscAlt1,noRscAlt2, voidC);⓪&ExitGem (gemHdl);⓪&TermProcess (0)⓪$END;⓪$⓪$menu := TreeAddress (Menu);⓪$msgBar := TreeAddress (Msgbar);⓪$scanBox := TreeAddress (Scanbox);⓪$shellBox := TreeAddress (Shellbox);⓪$optBox := TreeAddress (Optbox);⓪$sNameBox := TreeAddress (Snamebox);⓪$argBox := TreeAddress (Argbox);⓪$linkBox := TreeAddress (Loptbox);⓪$loadBox := TreeAddress (Loadbox);⓪$shellParmBox := TreeAddress (Sparmbox);⓪$editorParmBox := TreeAddress (Eparmbox);⓪$helpBox := TreeAddress (Helpbox);⓪$infoBox := TreeAddress (Infobox);⓪$⓪$pathToLongAlt := TextStringAddress (Pathalt);⓪$cOptToLongAlt := TextStringAddress (Optalt);⓪$memFullAlt := TextStringAddress (Memalt);⓪$debugAlt := TextStringAddress (Debugalt);⓪$parmSaveAlt := TextStringAddress (Parmsalt);⓪$noParmAlt := TextStringAddress (Noparalt);⓪$ContMakeAlt := TextStringAddress (Contmalt);⓪$noNewWorkAlt := TextStringAddress (Nowrkalt);⓪$exitShellAlt := TextStringAddress (Exitalt);⓪$noHelpAlt := TextStringAddress (Nohlpalt);⓪$⓪$NoLoadStr := TextStringAddress (Noldstr);⓪$OkStr := TextStringAddress (Okstr);⓪$EditStr := TextStringAddress (Editstr);⓪$EditBatStr := TextStringAddress (Editbstr);⓪$NoPathsStr := TextStringAddress (Npathstr);⓪$NoUnloadStr := TextStringAddress (Nouldstr);⓪$NoExecStr := TextStringAddress (Noexestr);⓪$RetStr := TextStringAddress (Retstr);⓪$EdStr := TextStringAddress (Edstr);⓪$WorkStr := TextStringAddress (Workstr);⓪$CompStr := TextStringAddress (Compstr);⓪$LinkStr := TextStringAddress (Linkstr);⓪$InfStr := TextStringAddress (Infstr);⓪$ContStr := TextStringAddress (Contstr);⓪$MakeStr := TextStringAddress (Makestr);⓪$⓪$changeWorkTitle := TextStringAddress (Chworkti);⓪$newWorkTitle := TextStringAddress (Neworkti);⓪$editTitle := TextStringAddress (Editti);⓪$compileTitle := TextStringAddress (Compti);⓪$executeTitle := TextStringAddress (Execti);⓪$compExecTitle := TextStringAddress (Coexti);⓪$linkTitle := TextStringAddress (Linkti);⓪$scanTitle := TextStringAddress (Scanti);⓪$folderTitle := TextStringAddress (Foldti);⓪$deleteTitle := TextStringAddress (Deleti);⓪$⓪$⓪2(* 'msgBar'-Ausmaße der Größe⓪3* des Ausgabegeräts anpassen⓪3*)⓪"⓪$devParm := DeviceParameter (dev);⓪$⓪$space.x := 0;⓪$space.y := 0;⓪$space.w := devParm^.rasterWidth + 1;⓪$space.h := deskSize.y-1;⓪$SetCurrObjTree (msgBar, FALSE);⓪$SetObjSpace (Root, space);⓪$SetObjSpace (Mbmsg, space);⓪$⓪$LinkTextString (Mbmsg, ADR (msgStr));⓪*⓪2(* Indizies ermitteln *)⓪2⓪$linkBoxIdx[1].check := Locheck1;⓪$linkBoxIdx[1].path := Lofname1;⓪$linkBoxIdx[2].check := Locheck2;⓪$linkBoxIdx[2].path := Lofname2;⓪$linkBoxIdx[3].check := Locheck3;⓪$linkBoxIdx[3].path := Lofname3;⓪$linkBoxIdx[4].check := Locheck4;⓪$linkBoxIdx[4].path := Lofname4;⓪$linkBoxIdx[5].check := Locheck5;⓪$linkBoxIdx[5].path := Lofname5;⓪$linkBoxIdx[6].check := Locheck6;⓪$linkBoxIdx[6].path := Lofname6;⓪$linkBoxIdx[7].check := Locheck7;⓪$linkBoxIdx[7].path := Lofname7;⓪$linkBoxIdx[8].check := Locheck8;⓪$linkBoxIdx[8].path := Lofname8;⓪$⓪$InitWorkFieldMenuIndizies;⓪$SetCurrObjTree (menu, FALSE);⓪$f := ObjectSpace (Wibox);⓪$WorkField.baseHeightOfWibox := f.h;⓪$f := ObjectSpace (Mwwork0);⓪$DEC (WorkField.baseHeightOfWibox, f.h * 10);⓪$⓪$SetTextString (shellBox, Version, ShellRevision);⓪$⓪$⓪2(* Initalisiere 'Tools'-Indizies *)⓪2⓪$ToolField[1].index := Mtool1;⓪$ToolField[2].index := Mtool2;⓪$ToolField[3].index := Mtool3;⓪$ToolField[4].index := Mtool4;⓪$ToolField[5].index := Mtool5;⓪$ToolField[6].index := Mtool6;⓪$ToolField[7].index := Mtool7;⓪$ToolField[8].index := Mtool8;⓪$ToolField[9].index := Mtool9;⓪$ToolField[10].index := Mtool10;⓪$⓪$TemporaryPath:= ShellPath;⓪$⓪$(*⓪%* Prüfen, ob ESC gedrückt wurde, weil dann beim Batch-Ausführen keine⓪%* Module geladen werden sollen.⓪%*)⓪$mayLoad:= TRUE;⓪$MultiEvent (EventSet {keyboard, timer}, 0, MButtonSet{}, MButtonSet{},⓪0lookForEntry, Rect (0,0,0,0), lookForEntry, Rect (0,0,0,0),⓪0eventmsg, 0, mouseloc, buttons, keystate, key, clicks, events);⓪$IF keyboard IN events THEN⓪&mayLoad:= key.ascii # 33C; (* ESC-Code *)⓪$END;⓪$LoadParameter (shellParm.parameterPath, mayLoad);⓪$⓪$ShowSS (TRUE);⓪$⓪$RETURN TRUE;⓪"END InitSS;⓪ ⓪ PROCEDURE HideSS (complete: BOOLEAN);⓪ ⓪"BEGIN⓪$IF complete THEN ClearDeskAndShowMsg END;⓪$ShowBee;⓪"END HideSS;⓪ ⓪ PROCEDURE ExitSS;⓪ ⓪"BEGIN⓪$msgStr := '';⓪$HideSS (TRUE);⓪$⓪$FreeResource;⓪$(* ExitGem (gemHdl); *)⓪"END ExitSS;⓪ ⓪*⓪0(* Routinen zur Event-Verarbeitung *)⓪0(* =============================== *)⓪ ⓪ (* keyManager -- Bearbeitet alle keyboard events⓪!*)⓪ ⓪ (*$Z-*)⓪ PROCEDURE keyManager (VAR ch: GemChar; VAR specials: SpecialKeySet): BOOLEAN;⓪ (*$Z=*)⓪ ⓪"CONST aCode = BYTE (30); (* Buchstabentasten *)⓪*cCode = BYTE (46);⓪*eCode = BYTE (18);⓪*fCode = BYTE (33);⓪*iCode = BYTE (23);⓪*lCode = BYTE (38);⓪*nCode = BYTE (49);⓪*mCode = BYTE (50);⓪*oCode = BYTE (24);⓪*pCode = BYTE (25);⓪*qCode = BYTE (16);⓪*rCode = BYTE (19);⓪*sCode = BYTE (31);⓪*uCode = BYTE (22);⓪*xCode = BYTE (45);⓪*⓪*code1A = BYTE (2); (* Ziffern *)⓪*code0A = BYTE (11);⓪*code7N = BYTE (103);⓪*code0N = BYTE (112);⓪*⓪*plusCode= BYTE (27); (* <+> *)⓪*⓪*clrHome = BYTE (71); (* <Clr>-Taste *)⓪*delete = BYTE (83); (* <Delete>-Taste *)⓪*help = BYTE (98); (* <Help>-Taste *)⓪*escape = BYTE (1); (* <Esc>-Taste *)⓪*f1 = BYTE (59); (* <F1> *)⓪*f10 = BYTE (68); (* <F10> *)⓪*shiftF1 = BYTE (84); (* Shift + <F1> *)⓪*shiftF10= BYTE (93); (* Shift + <F10> *)⓪"⓪"VAR buts : MButtonSet;⓪*loc : Point;⓪*⓪*success : BOOLEAN;⓪*msg : String;⓪*⓪$PROCEDURE withoutCtrl () :BOOLEAN;⓪$BEGIN⓪&RETURN ~ (controlKey IN specials)⓪$END withoutCtrl;⓪"⓪"BEGIN⓪"⓪$CASE ch.scan OF⓪$⓪&(* Commands *)⓪&⓪&aCode : actManager (Execute, specials, withoutCtrl (), FALSE, FALSE,⓪=FALSE)|⓪&cCode : IF withAlt (specials) THEN doCompilerOptionBox⓪1ELSE ⓪3actManager (Compile, specials, withoutCtrl (), FALSE, FALSE,⓪?FALSE)⓪1END|⓪&eCode : IF withAlt (specials) THEN doEditorParameterBox⓪1ELSE ⓪3actManager (Edit, specials, withoutCtrl (), FALSE, FALSE,⓪?FALSE)⓪1END|⓪&lCode : IF withAlt (specials) THEN doLinkerOptionBox⓪1ELSE ⓪3actManager (Link, specials, withoutCtrl (), FALSE, FALSE,⓪?FALSE)⓪1END|⓪&sCode : actManager (Scan, specials, withoutCtrl (), FALSE, FALSE,⓪=FALSE)|⓪&(*⓪&rCode : actManager (Resident, specials, withoutCtrl (), FALSE, FALSE,⓪=FALSE)|⓪'*)⓪&plusCode : actManager (Compile, specials, withoutCtrl (), FALSE, TRUE,⓪=FALSE)|⓪&⓪&oCode : makeFolder|⓪&⓪&pCode : IF NOT withCtrl (specials)⓪1AND (WorkField.current # noCurrentWorkfile) THEN⓪3doChangeWork (WorkField.current);⓪1END|⓪&⓪&mCode : Concat ('Making: ', MakeFileName, msg, voidO);⓪1truncCopyString (msg, msgStrLen, msgStr);⓪1action (doDftM, FALSE, FALSE)|⓪ ⓪&(* Menu: Datei *)⓪&⓪&nCode : makeNewWorkfile|⓪&delete : killWorkfile|⓪&qCode : IF withCtrl (specials) THEN quitStatus := quickQuit⓪1ELSE quitStatus := quit END|⓪&⓪&(* Menu: Parameter / Info *)⓪&⓪&xCode : IF withCtrl (specials) THEN saveParameter⓪1ELSE doShellParameterBox END|⓪&uCode : doInfoBox|⓪&help : IF withShift (specials) THEN editDocu (specials)⓪1ELSE doHelpBox (helpFile) END|⓪&⓪&(* Menu: Tools *)⓪&⓪&f1..f10 : executeTool (ORD (ch.scan) - ORD (f1) + 1, specials)|⓪&shiftF1..shiftF10⓪/: INCL (specials, leftShiftKey);⓪1executeTool (ORD (ch.scan) - ORD (shiftF1) + 1, specials)|⓪&⓪&(* work files *)⓪&⓪&code1A..code0A,⓪&code7N..code0N⓪/: selectWorkfile (ORD (ch.ascii) - ORD ('0'))|⓪1⓪$ELSE RETURN TRUE END;⓪$⓪$RETURN FALSE;⓪"END keyManager;⓪ ⓪ (* menuManager -- Bearbeitet alle message events, die durch Anklicken der⓪!* Menuzeile entstehen.⓪!*)⓪!⓪ (*$Z-*)⓪ PROCEDURE menuManager (title, item: CARDINAL): BOOLEAN;⓪ (*$Z=*)⓪"⓪"VAR i : CARDINAL;⓪*buts : MButtonSet;⓪*specials: SpecialKeySet;⓪*loc : Point;⓪*start : Rectangle;⓪#⓪"BEGIN⓪$MouseKeyState (loc,buts,specials);⓪$CASE item OF⓪&⓪&(* MShell *)⓪%⓪&Dinfo : animateMenuTitle (Mshell, start);⓪2DoSimpleBox (shellBox, start, voidC);⓪2deAnimateMenuTitle (Mshell)|⓪&⓪&(* Datei *)⓪&⓪&Mdfolder : makeFolder|⓪&Mddelete : deleteFile|⓪&Mdquit : quitStatus := quit|⓪&⓪&(* Bearbeiten *)⓪&⓪&Mdeditwo : actManager (Edit, specials, TRUE, FALSE, FALSE, FALSE)|⓪&Mdcompwo : actManager (Compile, specials, TRUE, FALSE, FALSE, FALSE)|⓪&Mdexecwo : actManager (Execute, specials, TRUE, FALSE, FALSE, FALSE)|⓪&Mdlinkwo : actManager (Link, specials, TRUE, FALSE, FALSE, FALSE)|⓪&Mdscanwo : actManager (Scan, specials, TRUE, FALSE, FALSE, FALSE)|⓪&Mdeditot : actManager (Edit, specials, FALSE, FALSE, FALSE, FALSE)|⓪&Mdcompot : actManager (Compile, specials, FALSE, FALSE, FALSE, FALSE)|⓪&Mdexecot : actManager (Execute, specials, FALSE, FALSE, FALSE, FALSE)|⓪&Mdlinkot : actManager (Link, specials, FALSE, FALSE, FALSE, FALSE)|⓪&Mdscanot : actManager (Scan, specials, FALSE, FALSE, FALSE, FALSE)|⓪&⓪&(* Arbeitsdatei *)⓪&⓪&Mwnew : makeNewWorkfile|⓪&Mwdelete : killWorkfile|⓪&Mwchange : IF WorkField.current # noCurrentWorkfile THEN⓪4doChangeWork (WorkField.current);⓪2END|⓪&Mwwork0 : selectWorkfile (0)|⓪&Mwwork1 : selectWorkfile (1)|⓪&Mwwork2 : selectWorkfile (2)|⓪&Mwwork3 : selectWorkfile (3)|⓪&Mwwork4 : selectWorkfile (4)|⓪&Mwwork5 : selectWorkfile (5)|⓪&Mwwork6 : selectWorkfile (6)|⓪&Mwwork7 : selectWorkfile (7)|⓪&Mwwork8 : selectWorkfile (8)|⓪&Mwwork9 : selectWorkfile (9)|⓪&⓪&(* Parameter / Info *)⓪&⓪&Mpshell : doShellParameterBox|⓪&Mpeditor : doEditorParameterBox|⓪&Mpcomp : doCompilerOptionBox|⓪&Mplink : doLinkerOptionBox|⓪&Mpsave : saveParameter|⓪&Mienv : doInfoBox|⓪&Mihelp : doHelpBox (helpFile)|⓪&Midocu : editDocu (specials)|⓪&⓪$ELSE⓪&⓪&(* Tools *)⓪$⓪&FOR i := 1 TO MaxTool DO⓪(IF item = ToolField[i].index THEN executeTool (i, specials) END⓪&END;⓪&⓪$END;⓪$⓪$NormalTitle (menu,title, TRUE);⓪$⓪$RETURN FALSE;⓪"END menuManager;⓪ ⓪ PROCEDURE TalkWithUser;⓪ ⓪"VAR worker : ARRAY [1..2] OF EventProc;⓪*⓪*success : BOOLEAN;⓪*⓪*firstA3,⓪*newA3 : LONGCARD;⓪*⓪*button : CARDINAL;⓪"⓪"BEGIN⓪$enableAndDisableMenuItems;⓪"⓪$worker[1].event := keyboard;⓪$worker[1].keyHdler := keyManager;⓪$worker[2].event := message;⓪$worker[2].msgType := menuSelected;⓪$worker[2].menuHdler := menuManager;⓪ ⓪$STORE (11, firstA3);⓪"⓪$REPEAT⓪"⓪&HandleEvents (0, MButtonSet{}, MButtonSet{},⓪4lookForEntry, Rect (0,0,0,0),⓪4lookForEntry, Rect (0,0,0,0),⓪40L,⓪4worker, 0);⓪"⓪&STORE (11, newA3);⓪&IF newA3 # firstA3 THEN⓪(LOAD (firstA3, 11);⓪(FormAlert (1, '[1][Heap fault][ OK ]', voidC);⓪&END;⓪&⓪&enableAndDisableMenuItems;⓪"⓪&currFn := ''; (* Damit 'lastFn' zum Zuge kommen kann *)⓪&⓪&(* handle a quit shell request⓪'*)⓪&IF quitStatus = quit THEN⓪(FormAlert (1, exitShellAlt^, button);⓪(IF button = 3 THEN quitStatus := noQuit⓪(ELSIF button = 1 THEN SaveParameter END;⓪&END;⓪$⓪$UNTIL quitStatus # noQuit;⓪"END TalkWithUser;⓪ ⓪ (*$Z-*) ⓪ PROCEDURE hdlTrap5 (VAR desc: ExcDesc): BOOLEAN;⓪ (*$Z=*)⓪"BEGIN⓪$doAlert (debugAlt); (* Fehlermeldung *)⓪$TermProcess (0); (* und ab damit *)⓪$RETURN FALSE (* Nur um des Compilers Willen *)⓪"END hdlTrap5;⓪ ⓪ ⓪ VAR i : CARDINAL;⓪(hdl : ADDRESS;⓪(wsp : MemArea;⓪ ⓪ BEGIN (* ShellShell *)⓪ ⓪"(* Vom Modula-System und der Shell benutzte Suffices:⓪#*)⓪"suf[prg] := 'PRG';⓪"suf[app] := 'APP';⓪"suf[tos] := 'TOS';⓪"suf[ttp] := 'TTP';⓪"suf[m2p] := 'M2P';⓪"suf[m2b] := 'M2B';⓪"suf[m2m] := 'M2M';⓪"suf[m2d] := 'M2D';⓪"(*⓪#* Die folgenden Endungen können verändert werden:⓪#* (Shell dann neu linken und alle Dateien mit den neuen Endungen⓪#* versehen - auch diejenigen in der Library "MM2DEF.M2L"!)⓪#*)⓪"suf[mod] := 'MOD'; (* Object-Files, GEM-Application *)⓪"suf[mos] := 'MOS'; (* Object-Files, TOS-Application *)⓪"suf[mtp] := 'MTP'; (* Object-Files, TTP-Application *)⓪"suf[imp] := 'IMP'; (* Object-Files bei Implementationsmodulen *)⓪"suf[def] := 'DEF'; (* Symbol-Files (übersetzte Definitionsmodule *)⓪"DefSrcSfx:= 'D'; (* ModRef: Definitions-Texte *)⓪"ImpSrcSfx:= 'I'; (* ModRef: Implementations-Texte *)⓪"ModSrcSfx:= 'M'; (* ModRef: Hauptmodul-Texte *)⓪ ⓪"(* Für Compiler: Suffices für erzeugte Dateien *)⓪"DefSfx:= suf[def]; (* Extension f. Symboldatei-Codes *)⓪"ImpSfx:= suf[imp]; (* Extension f. Implementations-Codes *)⓪"ModSfx:= suf[mod]; (* Extension f. Hauptmodul-Codes *)⓪ ⓪"(* Suffices für Loader (CallModule, LoadModule) *)⓪"MOSConfig.DftSfx:= suf[mod]; (* Default-Endung bei 'CallModule' *)⓪"MOSConfig.ImpSfx:= suf[imp]; (* Endung der importierten Module *)⓪ ⓪"(* some box info vars⓪#*)⓪"LastCodeName := '';⓪"LastCodeSize := 0L;⓪ ⓪"(* default configuration⓪#*)⓪ ⓪"MakeFileName := '';⓪ ⓪"WITH shellParm DO⓪$breakActive := TRUE;⓪$batchPath := batchFile;⓪$⓪$ShellRead (ShellName, args); (* Liest Pfad/Name der Shell und Argumentzeile *)⓪$IF args [0] # 0C THEN⓪&(* M2P-Dateiname wurde in Argumentzeile übergeben *)⓪&Assign (args, parameterPath, voidO)⓪$ELSE⓪&(* M2P-Dateiname wird aus Shell-Pfad u. "MM2SHELL.M2P" zusammengesetzt *)⓪&ConcatPath (ShellName, parameterFile, parameterPath)⓪$END;⓪$ConcatName (parameterPath, suf[m2p], parameterPath);⓪$MakeFullPath (parameterPath, voidI);⓪$⓪$waitOnReturn := FALSE;⓪"END;⓪"⓪"(* no work file.⓪#*)⓪"FOR i := 0 TO maxWorkFiles - 1 DO WorkField.elems[i].used := FALSE END;⓪"WorkField.noUsed := 0;⓪"WorkField.current := noCurrentWorkfile;⓪"⓪"WITH EditorParm DO⓪$name:= 'GME';⓪$searchSources := FALSE;⓪$waitOnError := FALSE;⓪$tempShellFile := FALSE;⓪$tempShellName := '';⓪$tempEditorFile := FALSE;⓪$tempEditorName := '';⓪$passArgument := TRUE;⓪$passName := TRUE;⓪$passErrorText := TRUE;⓪$passErrorPos := TRUE;⓪"END;⓪"⓪"ErrListFile := 'MODULA.ERR';⓪"MainOutputPath := '';⓪"WITH CompilerParm DO (* Compiler-Parameter: *)⓪$name:= 'MM2Comp';⓪$shortMsgs := FALSE; (* - keine Kurzausgaben *)⓪$protocol := FALSE; (* - kein Protokoll *)⓪$protWidth := stdProtWidth;⓪$protName := '';⓪"END;⓪"⓪"WITH LinkerParm DO⓪$name := 'MM2Link';⓪$FOR i := MIN (LLRange) TO MAX (LLRange) DO⓪&linkList[i].valid := FALSE;⓪&linkList[i].name := '';⓪$END;⓪$optimize := fullOptimize; (* - Vollständige Optimierung *)⓪$linkStackSize := 0;⓪$maxLinkMod := 100;⓪$fastLoad := TRUE;⓪$fastCode := TRUE;⓪$fastMemory:= TRUE;⓪$symbolFile:= FALSE;⓪$symbolArgs:= ''; (* optional: Argumente f. 'MM2LnkIO.OutputSymbols' *)⓪$outputName:= ''; (* optional: Name d. Ausgabedatei *)⓪"END;⓪"⓪"FOR i := 1 TO MaxTool DO ToolField[i].used := FALSE END; (* Keine Tools *)⓪"⓪"msgStr := '';⓪"⓪"(* TRAP #5 belegen, um Fehlermeldung auszugeben, wenn in einem Modul $D+⓪#* verwendet wird, ohne 'Debug'-Modul importiert zu haben *)⓪"wsp.bottom := ADR (ExceptsStack);⓪"wsp.length := SIZE (ExceptsStack);⓪"InstallPreExc (ExcSet{TRAP5}, hdlTrap5, TRUE, wsp, hdl);⓪ ⓪"quitStatus := noQuit;⓪ ⓪ END ShellShell;⓪ ⓪ ⓪((***************************)⓪((* Hier endet 'ShellShell' *)⓪((***************************)⓪ ⓪ ⓪ CONST mspFileMagic = 10071898L + 02700000000L; (* ab 20: TinyShell *)⓪(escKey = 33C;⓪ ⓪ TYPE PtrStr = POINTER TO String;⓪(AutoCmd = (noCmd, scan, edit, compile, execute, comp_exec, exec_src,⓪3make_exec, dftMake, dftMake_exec, contMake);⓪ ⓪ VAR ready : BOOLEAN;⓪%dummy : INTEGER;⓪%handle : INTEGER;⓪%strVal : BOOLEAN;⓪%buttonNum: CARDINAL;⓪%editorsMakeCmd,⓪%autoCmd : AutoCmd;⓪%shellStart,⓪%makeActive : BOOLEAN;⓪%callRes : LoaderResults;⓪%callMsg : String;⓪%exitCode : INTEGER;⓪%voidO : BOOLEAN;⓪%voidI : INTEGER;⓪%voidC : CARDINAL;⓪ ⓪%withPost1, withPost2: BOOLEAN;⓪%postAmble1, postAmble2, postArgs1, postArgs2: String;⓪ ⓪ ⓪ PROCEDURE FileAlert (errNo: INTEGER);⓪ ⓪"VAR msg : ARRAY[0..50] OF CHAR;⓪ ⓪"BEGIN⓪$IF (errNo < fOK) AND (errNo # fDriveNotReady) AND (errNo # fWriteProtected)⓪$THEN⓪&GetStateMsg (errNo, msg);⓪&Concat ('[1][', msg, msg, voidO);⓪&Append ('][ OK ]', msg, voidO);⓪&FormAlert (1, msg, voidC);⓪$END;⓪"END FileAlert;⓪ ⓪ PROCEDURE SaveParameter;⓪ ⓪"VAR f : File;⓪"⓪"PROCEDURE ioErr (): BOOLEAN;⓪"⓪$VAR ioRes: INTEGER;⓪"⓪$BEGIN⓪&ioRes := State (f);⓪&IF ioRes < fOK THEN⓪(ResetState (f);⓪(FileAlert (ioRes);⓪(Remove (f);⓪(ShowArrow;⓪&END;⓪&RETURN ioRes < fOK⓪$END ioErr;⓪$⓪"PROCEDURE wBlock (VAR data: ARRAY OF BYTE): BOOLEAN;⓪"⓪$BEGIN⓪&WriteBlock (f, data);⓪&RETURN ~ ioErr ()⓪$END wBlock;⓪"⓪"VAR magic: LONGCARD;⓪(ok: BOOLEAN;⓪"BEGIN⓪$ShowBee;⓪$⓪$Create (f, HomeReplaced (shellParm.parameterPath), writeOnly, replaceOld);⓪$IF State (f) # fOK THEN FileAlert (State (f)); RETURN END;⓪$⓪$magic := mspFileMagic;⓪$LOOP (* Ist keine echte Schleife - lediglich f. einfacheres EXIT *)⓪&ok:= FALSE;⓪&IF ~ wBlock (magic) THEN EXIT END;⓪&IF ~ wBlock (shellParm) THEN EXIT END;⓪&IF ~ wBlock (WorkField) THEN EXIT END;⓪&IF ~ wBlock (lastFn) THEN EXIT END;⓪&IF ~ wBlock (CodeName) THEN EXIT END;⓪&IF ~ wBlock (EditorParm) THEN EXIT END;⓪&IF ~ wBlock (CompilerParm) THEN EXIT END;⓪&IF ~ wBlock (LinkerParm) THEN EXIT END;⓪&IF ~ wBlock (DefaultStackSize) THEN EXIT END;⓪&IF ~ wBlock (TemporaryPath) THEN EXIT END;⓪&IF ~ wBlock (MakeFileName) THEN EXIT END;⓪&IF ~ wBlock (DefLibName) THEN EXIT END;⓪&IF ~ wBlock (ErrListFile) THEN EXIT END;⓪&IF ~ wBlock (MainOutputPath) THEN EXIT END;⓪&IF ~ wBlock (CompilerArgs) THEN EXIT END;⓪&ok:= TRUE;⓪&EXIT⓪$END;⓪$IF NOT ok THEN RETURN END;⓪$⓪$Close (f);⓪$⓪$ShowArrow;⓪"END SaveParameter;⓪ ⓪ PROCEDURE LoadParameter (REF name: ARRAY OF CHAR; loadInBatch: BOOLEAN);⓪ ⓪"VAR f : File;⓪(fname : FileStr;⓪ ⓪"PROCEDURE ioErr (): BOOLEAN;⓪"⓪$VAR ioRes: INTEGER;⓪"⓪$BEGIN⓪&ioRes := State (f);⓪&IF ioRes < fOK THEN⓪(ResetState (f);⓪(FileAlert (ioRes);⓪(Close (f);⓪(ShowArrow;⓪&END;⓪&RETURN ioRes < fOK⓪$END ioErr;⓪$⓪"PROCEDURE rBlock (VAR data: ARRAY OF BYTE): BOOLEAN;⓪"⓪$BEGIN⓪&ReadBlock (f, data);⓪&RETURN ~ ioErr ()⓪$END rBlock;⓪ ⓪"VAR magic, n: LONGCARD;⓪(ch: CHAR;⓪(ok: BOOLEAN;⓪"⓪"BEGIN⓪$ShowBee;⓪$⓪$Assign (name, fname, voidO);⓪$ReplaceHome (fname);⓪$MakeFullPath (fname, voidI);⓪$Open (f, fname, readOnly);⓪$IF State (f) # fOK THEN FormAlert (1, noParmAlt^, voidC); RETURN END;⓪$⓪$IF ~ rBlock (magic) THEN RETURN END;⓪$IF magic = mspFileMagic THEN⓪&LOOP (* Ist keine echte Schleife - lediglich f. einfacheres EXIT *)⓪(ok:= FALSE;⓪(IF ~ rBlock (shellParm) THEN EXIT END;⓪(IF ~ rBlock (WorkField) THEN EXIT END;⓪(IF ~ rBlock (lastFn) THEN EXIT END;⓪(IF ~ rBlock (CodeName) THEN EXIT END;⓪(IF ~ rBlock (EditorParm) THEN EXIT END;⓪(IF ~ rBlock (CompilerParm) THEN EXIT END;⓪(IF ~ rBlock (LinkerParm) THEN EXIT END;⓪(IF ~ rBlock (DefaultStackSize) THEN EXIT END;⓪(IF ~ rBlock (TemporaryPath) THEN EXIT END;⓪(IF ~ rBlock (MakeFileName) THEN EXIT END;⓪(IF ~ rBlock (DefLibName) THEN EXIT END;⓪(IF ~ rBlock (ErrListFile) THEN EXIT END;⓪(IF ~ rBlock (MainOutputPath) THEN EXIT END;⓪(IF ~ rBlock (CompilerArgs) THEN EXIT END;⓪(ok:= TRUE;⓪(EXIT⓪&END;⓪&IF NOT ok THEN RETURN END;⓪ ⓪&Assign (fname, shellParm.parameterPath, voidO);⓪ ⓪$ELSE⓪&FormAlert (1, noParmAlt^, voidC)⓪$END;⓪$Close (f);⓪$⓪$InitWorkFieldMenuIndizies;⓪$⓪$(* If a batch file is specified, execute it. *)⓪$IF NOT Empty (shellParm.batchPath) THEN⓪&ExecuteBatch (shellParm.batchPath, loadInBatch)⓪$END;⓪$⓪$ShowArrow;⓪"END LoadParameter;⓪ ⓪ ⓪ PROCEDURE PrepareScan;⓪ ⓪"BEGIN⓪$ScanAddr := CallingChain [ScanIndex].relAddr;⓪$ScanOpts := CallingChain [ScanIndex].codeOpts;⓪$Assign (CallingChain [ScanIndex].sourceName, TextName, voidO);⓪"END PrepareScan;⓪ ⓪ PROCEDURE readWorkNames;⓪ ⓪"BEGIN⓪$WITH WorkField DO⓪&IF current >= 0 THEN⓪(workFName := elems[current].sourceName;⓪(workCName := elems[current].codeName;⓪&ELSE⓪(workFName := ''; workCName := '';⓪&END;⓪$END;⓪"END readWorkNames;⓪ ⓪ PROCEDURE writeWorkName (REF source, code: ARRAY OF CHAR);⓪"VAR i : INTEGER;⓪"BEGIN (* richtige Arbeitsdatei suchen und Code speichern *)⓪$WITH WorkField DO⓪&IF current >= 0 THEN⓪(FOR i:= 0 TO maxWorkFiles-1 DO⓪*IF elems[i].used & StrEqual (source, elems[i].sourceName) THEN⓪,Assign (code, elems[i].codeName, voidO);⓪,RETURN⓪*END⓪(END⓪&END;⓪$END;⓪"END writeWorkName;⓪ ⓪ PROCEDURE Bconout ( c: CHAR );⓪"(*$L-*)⓪"BEGIN⓪$ASSEMBLER⓪(SUBQ.L #1,A3⓪(MOVEQ #0,D0⓪(MOVE.B -(A3),D0⓪(MOVE D0,-(A7)⓪(MOVE #2,-(A7)⓪(MOVE #3,-(A7)⓪(TRAP #13⓪(ADDQ.L #6,A7⓪$END⓪"END Bconout;⓪"(*$L=*)⓪ ⓪ (*$Z-*)⓪ PROCEDURE Bconin (): CHAR;⓪ (*$Z=*)⓪"(*$L-*)⓪"BEGIN⓪$ASSEMBLER⓪(MOVE #2,-(A7)⓪(MOVE #2,-(A7)⓪(TRAP #13⓪(ADDQ.L #4,A7⓪(MOVE.B D0,(A3)+⓪(CLR.B (A3)+⓪$END⓪"END Bconin;⓪"(*$L=*)⓪ ⓪ (*$Z-*)⓪ PROCEDURE Bconstat (): BOOLEAN;⓪ (*$Z=*)⓪"(*$L-*)⓪"BEGIN⓪$ASSEMBLER⓪(MOVE #2,-(A7)⓪(MOVE #1,-(A7)⓪(TRAP #13⓪(ADDQ.L #4,A7⓪(TST D0⓪(SNE D0⓪(ANDI #1,D0⓪(MOVE.W D0,(A3)+⓪$END⓪"END Bconstat;⓪"(*$L=*)⓪ ⓪ PROCEDURE clrscr;⓪"BEGIN⓪$Bconout (33C); Bconout ('E');⓪"END clrscr;⓪ ⓪ PROCEDURE curon;⓪"BEGIN⓪$Bconout (33C); Bconout ('e');⓪"END curon;⓪ ⓪ PROCEDURE curoff;⓪"BEGIN⓪$Bconout (15C); Bconout (33C); Bconout ('f');⓪"END curoff;⓪ ⓪ PROCEDURE bing;⓪"BEGIN⓪$Bconout (7C);⓪"END bing;⓪ ⓪ ⓪ PROCEDURE alert ( REF s1,s2,s3: ARRAY OF CHAR );⓪"VAR msg: ARRAY [0..269] OF CHAR;⓪"BEGIN⓪$Assign (s1, msg, voidO);⓪$WrapAlert (msg, 0);⓪$IF s2[0] # 0C THEN⓪&Append ('|', msg, strVal);⓪&Append (s2, msg, voidO);⓪&WrapAlert (msg, 0);⓪$END;⓪$Insert ('[0][',0,msg,strVal);⓪$Append ('][]',msg,strVal);⓪$Insert (s3,CARDINAL(Length(msg)-1),msg, voidO);⓪$FormAlert (1, msg,buttonNum);⓪"END alert;⓪"⓪ PROCEDURE load;⓪ ⓪"VAR r : LoaderResults;⓪*msg : ARRAY [0..79] OF CHAR;⓪*name : FileStr;⓪"⓪"BEGIN⓪$IF Empty (currFn) THEN name := CodeName ELSE name := currFn END;⓪$TellLoading (newTellValue, name);⓪$LoadModule (name, StdPaths, name, msg, r);⓪$IF r # noError THEN alert (conc (name, NoLoadStr^), msg, OkStr^) END;⓪"END load;⓪ ⓪ PROCEDURE unload;⓪ ⓪"VAR r : LoaderResults;⓪*name : FileStr;⓪"⓪"BEGIN⓪$IF Empty (currFn) THEN name := CodeName ELSE name := currFn END;⓪$UnLoadModule (name, r);⓪$IF r # noError THEN alert (conc (name, NoUnloadStr^), '', OkStr^) END;⓪"END unload;⓪ ⓪ PROCEDURE closeAllWindows;⓪"VAR w: CARDINAL;⓪"BEGIN⓪$AESWindows.UpdateWindow (TRUE);⓪$LOOP⓪&w:= AESWindows.TopWindow ();⓪&IF w = 0 THEN EXIT END;⓪&AESWindows.CloseWindow (w);⓪&AESWindows.DeleteWindow (w);⓪$END;⓪$IF (GEMEnv.GEMVersion() >= $140) THEN⓪&(* UpdateWindow(FALSE) hier unnötig - siehe ST-Magazin 3/91 Seite 92. *)⓪&AESWindows.ResetWindows ();⓪$ELSE⓪&AESWindows.UpdateWindow (FALSE);⓪$END;⓪"END closeAllWindows;⓪ ⓪ VAR callSwitchedToTextMode: BOOLEAN;⓪ ⓪ PROCEDURE call ( VAR modname: ARRAY OF CHAR; args: ARRAY OF CHAR;⓪1stackSize: LONGCARD; interactive, checkError, tool:BOOLEAN );⓪ ⓪"TYPE SufSet = SET OF MySuf;⓪"⓪"VAR sufstr : ARRAY[0..2] OF CHAR;⓪&dummy : ARRAY[0..12] OF CHAR;⓪&name, path,⓪&oldPath : PathStr;⓪&getparm : BOOLEAN;⓪&prgType : AESMisc.ProgramType;⓪&sufcnt, suffix : MySuf;⓪&res : INTEGER;⓪&dummyChar : CHAR;⓪&hdl : ADDRESS;⓪&prevStackSize : LONGCARD;⓪ ⓪"BEGIN⓪$Assign (modname, name, voidO);⓪$Upper (name);⓪ ⓪$SplitPath (name, path, dummy);⓪$SplitName (dummy,dummy,sufstr);⓪$suffix:= mod;⓪$IF sufstr[0] = 0C THEN⓪&ConcatName (name, suf[mod], name)⓪$ELSE⓪&FOR sufcnt:= MIN (MySuf) TO MAX (MySuf) DO⓪(IF StrEqual (sufstr,suf[sufcnt]) THEN⓪*suffix := sufcnt;⓪(END⓪&END;⓪$END;⓪$prgType:= AESMisc.graphicPrgm;⓪$getparm:= FALSE;⓪$IF suffix IN SufSet {ttp,mtp} THEN getparm:= interactive END;⓪$IF suffix IN SufSet {ttp,mtp,tos,mos} THEN prgType:= AESMisc.textPrgm END;⓪ ⓪$IF getparm THEN⓪&RequestArg (args);⓪$END;⓪ ⓪$GetDefaultPath (oldPath);⓪$IF ~noDirChange THEN⓪&IF (path[0] = 0C) AND NOT tool THEN⓪((* Ist kein Pfad angegeben, bleibt bei Tools und⓪)* Systemprgs der akt. Pfad erhalten⓪)*)⓪(SearchFile (name, StdPaths, fromStart, voidO, name);⓪(SplitPath (name, path, dummy);⓪&END;⓪&ReplaceHome (path);⓪&SetDefaultPath (path, voidI)⓪$END;⓪ ⓪$callSwitchedToTextMode := (prgType = AESMisc.textPrgm);⓪ ⓪$(*$? UseExtKeys: IF NOT tool THEN DeInstallKbdEvents END; *)⓪$⓪$IF NOT multiGEM & NOT multiTOS THEN⓪&closeAllWindows; (* alle noch offenen Fenster (von ACCs) schließen *)⓪$END;⓪ ⓪$IF prgType = AESMisc.textPrgm THEN⓪&HideMouse;⓪&clrscr;⓪&curon;⓪$END;⓪$⓪$IF DoShellWrite AND (GEMEnv.GEMVersion() >= $140) THEN⓪&IF NOT multiTOS THEN⓪(AESMisc.ShellWrite (TRUE, prgType, name, args);⓪&END⓪$END;⓪ ⓪$IF NOT multiGEM & NOT multiTOS THEN⓪&(* AC_CLOSE-Nachricht an alle Accessories schicken *)⓪&appl_exit; (* nach appl_exit kein AES-Aufruf mehr! *)⓪$END;⓪$⓪$prevStackSize:= DefaultStackSize;⓪$IF stackSize # 0 THEN DefaultStackSize:= stackSize END;⓪$CallModule (name, StdPaths, args, NIL, exitCode, callMsg, callRes);⓪$DefaultStackSize:= prevStackSize;⓪ ⓪$IF NOT multiGEM & NOT multiTOS THEN⓪&(* beim GEM wieder anmelden *)⓪&appl_init; (* erst jetzt wieder AES-Aufrufe erlaubt! *)⓪$END;⓪(⓪$IF DoShellWrite AND (GEMEnv.GEMVersion() >= $140) THEN⓪&IF NOT multiTOS THEN⓪((* Dies alles funktioniert erst ab TOS 1.4 richtig *)⓪(AESMisc.ShellWrite (FALSE, AESMisc.graphicPrgm, ShellName, '');⓪&END⓪$END;⓪$⓪$IF prgType = AESMisc.textPrgm THEN⓪&(* Nach Programmende bei TOS-Programmen auf Tastendruck warten *)⓪&IF interactive & shellParm.waitOnReturn⓪)& NOT ScanMode & (callRes = noError) THEN⓪(WHILE Bconstat () DO dummyChar:= Bconin () END;⓪(curon;⓪(dummyChar:= Bconin ()⓪&END;⓪&curoff;⓪&ShowMouse⓪$END;⓪ ⓪$IF NOT multiGEM & NOT multiTOS THEN⓪&closeAllWindows; (* alle noch offenen Fenster (von ACCs) schließen *)⓪$END;⓪ ⓪$ClearDeskAndShowMsg;⓪$⓪$IF Inconsistent () THEN⓪&alert (memErrorAlt, '', OkStr^)⓪$END;⓪ ⓪$(*$? UseExtKeys: IF NOT tool THEN InstallKbdEvents END; *)⓪ ⓪$SetDefaultPath (oldPath, res);⓪ ⓪$IF checkError THEN⓪&IF callRes # noError THEN⓪(IF callRes = exitFault THEN⓪*alert (callMsg, '', OkStr^)⓪(ELSE⓪*alert (conc (name, NoExecStr^), callMsg, OkStr^)⓪(END⓪&ELSIF ScanMode THEN⓪(PrepareScan;⓪(IF ScanBox (TextName) THEN⓪*autoCmd := scan⓪(ELSE⓪*autoCmd := noCmd⓪(END⓪&ELSIF exitCode # 0 THEN⓪(CASE exitCode OF⓪*fFileNotFound,⓪*fPathNotFound,⓪*fInvalidDrive: FormError (2)|⓪4(* "Diese Anwendung kann Datei oder Ordner nicht finden" *)⓪*fAccessDenied: FormError (5)|⓪6(* "Datei existiert bereits oder ist Schreibgeschützt" *)⓪*fTooManyOpen,⓪*fInsufficientMemory: FormError (8)|⓪-(* "Es steht nicht genug Speicher für diese Anw. zur Verfügung" *)⓪(ELSE⓪*alert (conc (RetStr^, IntToStr (exitCode, 0)), '', OkStr^)⓪(END⓪&END⓪$END;⓪$ScanMode := FALSE⓪"END call;⓪ ⓪ ⓪ PROCEDURE callEdit (VAR s0: ARRAY OF CHAR; errMsg: BOOLEAN);⓪ ⓪"VAR s, voidStr,⓪&tempPath : ARRAY [0..126] OF CHAR;⓪&f : File;⓪&lastBreak : BOOLEAN;⓪&zero : CARDINAL;⓪ ⓪"PROCEDURE writeTempFile;⓪ ⓪$PROCEDURE stateError (): BOOLEAN;⓪ ⓪&BEGIN⓪(IF State (f) # fOK THEN⓪*FileAlert (State (f));⓪*ResetState (f);⓪*Remove (f);⓪*RETURN TRUE⓪(ELSE RETURN FALSE END;⓪&END stateError;⓪$⓪$PROCEDURE writeLn (VAR str: ARRAY OF CHAR): BOOLEAN;⓪$⓪&BEGIN⓪(Text.WriteString (f, str);⓪(IF stateError () THEN RETURN FALSE END;⓪(Text.WriteLn (f);⓪(IF stateError () THEN RETURN FALSE END;⓪(RETURN TRUE⓪&END writeLn;⓪$⓪$VAR s2: Str128;⓪&⓪$BEGIN⓪&ReplaceHome (tempPath);⓪&Create (f, tempPath, writeSeqTxt, replaceOld);⓪&IF stateError () THEN RETURN END;⓪&IF ~ EditorParm.passName THEN⓪(IF ~ writeLn (TextName) THEN RETURN END;⓪&END;⓪&IF ~ EditorParm.passErrorPos AND errMsg THEN⓪(Assign (CardToStr (TextLine, 0), s2, voidO);⓪(Append (' ', s2, voidO);⓪(Append (CardToStr (TextCol - 1, 0), s2, voidO);⓪(IF ~ writeLn (s2) THEN RETURN END;⓪&END;⓪&IF ~ EditorParm.passErrorText AND errMsg THEN⓪(IF ~ writeLn (ErrorMsg) THEN RETURN END;⓪&END;⓪&Close (f);⓪$END writeTempFile;⓪ ⓪"BEGIN⓪$Split (s0, PosLen (' ', s0, 0), TextName, s, voidO);⓪$IF EditorParm.searchSources THEN⓪&SearchFile (TextName, SrcPaths, fromStart, voidO, TextName)⓪$END;⓪$IF EditorParm.passName THEN Insert (TextName, 0, s, voidO) END;⓪ ⓪$(* Zeiger auf akt. Dateinamen dem Editor mit übergeben⓪&IF isToolbox THEN⓪(Append (' ^', s, voidO);⓪(Append (CardToStr (LONGCARD (ADR (TextName)), 0), s, voidO);⓪(Append (' ', s, voidO);⓪&END;⓪$*)⓪ ⓪$IF EditorParm.tempShellFile THEN⓪&SplitPath (EditorParm.name, tempPath, voidStr);⓪&Append (EditorParm.tempShellName, tempPath, voidO);⓪&Append (tempPath, s, strVal);⓪&writeTempFile;⓪$END;⓪$⓪$IF ~ EditorParm.passArgument THEN s := '' END;⓪$⓪$lastBreak:= shellParm.breakActive;⓪$shellParm.breakActive:= FALSE;⓪$call (EditorParm.name, s, EditorStackSize, FALSE, FALSE, TRUE);⓪$shellParm.breakActive:= lastBreak;⓪$⓪$IF EditorParm.tempEditorFile THEN⓪&SplitPath (EditorParm.name, tempPath, voidStr);⓪&Append (EditorParm.tempEditorName, tempPath, voidO);⓪&ReplaceHome (tempPath);⓪&Open (f, tempPath, readSeqTxt);⓪&IF State (f) = fOK THEN⓪(Text.ReadString (f, s);⓪(Close (f);⓪(zero := 0;⓪(exitCode := StrToCard (s, zero, strVal);⓪(IF ~ strVal THEN exitCode := 0 END;⓪&ELSE⓪(exitCode:= 0⓪&END;⓪$END;⓪$⓪$autoCmd := noCmd;⓪$IF callRes # noError THEN⓪&alert (EdStr^, callMsg, OkStr^)⓪$ELSE⓪&CASE exitCode OF⓪(1: autoCmd := compile|⓪(2: autoCmd := exec_src|⓪(3: autoCmd := dftMake|⓪(4: autoCmd := dftMake_exec|⓪&ELSE⓪&END;⓪&IF (autoCmd = dftMake_exec) OR (autoCmd = dftMake) THEN⓪(IF NOT makeActive THEN⓪*editorsMakeCmd:= autoCmd;⓪*makeActive:= TRUE;⓪(END;⓪(autoCmd:= contMake⓪&ELSE⓪(IF makeActive THEN⓪*FormAlert (1, ContMakeAlt^, buttonNum);⓪*IF buttonNum = 1 THEN⓪,autoCmd:= contMake⓪*END⓪(END⓪&END⓪$END;⓪"END callEdit;⓪ ⓪ PROCEDURE hdedit (wrk: BOOLEAN);⓪ ⓪"VAR name1, name2: NameStr;⓪&dummy : Str128;⓪"⓪"BEGIN⓪$IF wrk THEN⓪&callEdit (workFName, FALSE);⓪$ELSE⓪&callEdit (currFn, FALSE)⓪$END;⓪$Upper (TextName);⓪$SplitPath (TextName, dummy, name1);⓪$SplitPath (workFName, dummy, name2);⓪$IF NOT StrEqual (name1, name2) THEN lastFn := TextName END;⓪"END hdedit;⓪ ⓪ PROCEDURE hdrun (wrk, tool: BOOLEAN);⓪ ⓪"VAR found,⓪(codeOK : BOOLEAN;⓪(f : File;⓪(cDate,⓪(sDate : Clock.Date;⓪(cTime,⓪(sTime : Clock.Time;⓪(sname,⓪(cname,⓪(voidStr,⓪(suffix : FileStr;⓪ ⓪ ⓪"PROCEDURE longTime (d:Clock.Date; t:Clock.Time): LONGCARD;⓪$BEGIN⓪&RETURN LONG (Clock.PackDate (d)) * $10000 + LONG (Clock.PackTime (t))⓪$END longTime;⓪ ⓪"PROCEDURE getCodeDateTime ( suffix: MySuf;⓪Apaths : PathList;⓪=VAR cname : FileStr;⓪=VAR found : BOOLEAN);⓪$VAR testName: FileStr;⓪(testN2: FileStr;⓪(path: ptrString;⓪$BEGIN⓪&found:= FALSE;⓪ ⓪&ConcatName (cname, suf[suffix], testN2);⓪&IF NOT Empty (MainOutputPath) THEN⓪((* Eingestellten Ausgabe-Pfad prüfen *)⓪(Concat (MainOutputPath, testN2, testName, voidO);⓪&ELSE⓪((* Ausgabe-Pfad aus Compiler-Pfaden prüfen *)⓪(IF suffix = imp THEN⓪*Concat (ImpOutPath, testN2, testName, voidO);⓪(ELSE⓪*Concat (ModOutPath, testN2, testName, voidO);⓪(END⓪&END;⓪&ReplaceHome (testName);⓪&Open (f, testName, readOnly);⓪&found:= (State (f) >= fOK);⓪&IF NOT found THEN⓪((* Datei auf Default-Pfaden suchen *)⓪(SearchFile (testN2, paths, fromStart, found, testName);⓪(IF found THEN⓪*Open (f, testName, readOnly);⓪(END⓪&END;⓪&IF found THEN⓪(GetDateTime (f, cDate, cTime);⓪(Close (f);⓪(cname:= testName;⓪&END;⓪$END getCodeDateTime;⓪ ⓪"BEGIN (* hdrun *)⓪$codeOK := FALSE;⓪$(* check, wether code is valid if source is executed *)⓪$IF wrk THEN⓪&SearchFile (workFName, SrcPaths, fromStart, found, sname);⓪$ELSIF IsSourceName (currFn) THEN⓪&SearchFile (currFn, SrcPaths, fromStart, found, sname)⓪$ELSE⓪&(* wir haben einen Code -> sofort ausführen *)⓪&codeOK := TRUE⓪$END;⓪$IF NOT codeOK THEN⓪&IF found THEN⓪((* Source vorhanden *)⓪(IF wrk THEN⓪*workFName:= sname; cname:= workCName⓪(ELSE⓪*currFn:= sname; cname:= ''⓪(END;⓪(IF Empty (cname) THEN⓪*(* Wir müssen den Code suchen *)⓪*SplitPath (sname, voidStr, cname);⓪*SplitName (cname, cname, suffix);⓪*getCodeDateTime (mod, ModPaths, cname, codeOK);⓪*IF NOT codeOK THEN⓪,getCodeDateTime (mos, ModPaths, cname, codeOK) END;⓪*IF NOT codeOK THEN⓪,getCodeDateTime (mtp, ModPaths, cname, codeOK) END;⓪*IF NOT codeOK THEN⓪,getCodeDateTime (imp, ImpPaths, cname, codeOK) END;⓪(ELSE⓪*(* Code schon vorhanden *)⓪*Open (f, cname, readOnly);⓪*codeOK:= (State (f) = fOK);⓪*IF codeOK THEN⓪,GetDateTime (f, cDate, cTime);⓪,Close (f);⓪*END;⓪(END;⓪(IF codeOK THEN⓪*(* Code vorhanden -> Zeit der Source ermitteln und mit Code vergl. *)⓪*Open (f, sname, readOnly);⓪*GetDateTime (f, sDate, sTime);⓪*Close (f);⓪*codeOK:= longTime (cDate,cTime) >= longTime (sDate,sTime);⓪(END;⓪&ELSE⓪((* Source nicht vorhanden -> Fehler melden? *)⓪((* wenn nicht, wird einfach Compiler gestartet... (weil codeOK=FALSE) *)⓪&END;⓪&⓪$ELSE⓪&cname:= currFn⓪$END;⓪$⓪$IF codeOK THEN⓪&IF wrk THEN workCName := cname⓪&ELSE CodeName := cname END;⓪&call (cname, args, 0, TRUE, TRUE, tool)⓪$ELSE⓪&IF wrk THEN workCName:= '' END;⓪&TextName := sname;⓪&autoCmd := comp_exec⓪$END⓪$⓪"END hdrun;⓪ ⓪ ⓪ PROCEDURE DoEditBox (batch, mustShow: BOOLEAN; VAR cont: BOOLEAN);⓪"VAR s: String;⓪&msg: Str128;⓪&buttonNum: CARDINAL;⓪"BEGIN⓪$(* Signalton: *)⓪$bing;⓪$IF mustShow OR EditorParm.waitOnError THEN⓪&msg := '[2][][]';⓪&IF batch THEN⓪(Insert (EditBatStr^, 6, msg, voidO)⓪&ELSE⓪(Insert (EditStr^, 6, msg, voidO)⓪&END;⓪&s:= ErrorMsg;⓪&WrapAlert (s, 0);⓪&Insert (s, 4, msg, voidO);⓪&FormAlert (1, msg, buttonNum);⓪&IF buttonNum = 1 THEN⓪(autoCmd:= edit; cont:= FALSE;⓪&ELSE⓪(autoCmd:= noCmd; cont:= (buttonNum = 2);⓪&END⓪$ELSE⓪&autoCmd:= edit; cont:= FALSE;⓪$END⓪"END DoEditBox;⓪ ⓪ ⓪ (* callComp -- Calls the compiler to compile the file 'modName'.⓪!* 'work = TRUE' means the workfile is compiled.⓪!* 'batch = TRUE' means the compiler is called while⓪!* executing a batch file. In that case 'cont' states,⓪!* if the execution of the batch file has to continue⓪!* after this proc. returns.⓪!*)⓪ ⓪ PROCEDURE callComp (VAR modname: ARRAY OF CHAR;⓪8work,⓪8batch : BOOLEAN;⓪4VAR cont : BOOLEAN);⓪ ⓪"VAR i:INTEGER;⓪&s,msg:Str128;⓪ ⓪"BEGIN⓪$(* String mit Compileroptionen aufbauen.⓪%*)⓪$WITH CompilerParm DO⓪&IF shortMsgs THEN s:= ' -Q' ELSE s:= ' +Q' END;⓪&Append (' ', s, voidO);⓪&Append (CompilerArgs, s, voidO);⓪&IF ~ Empty (MainOutputPath) THEN⓪(Append (' /O', s, voidO);⓪(Append (MainOutputPath, s, voidO);⓪&END;⓪&IF protocol THEN⓪(Append (' /C', s, voidO);⓪(Append (CardToStr (protWidth, 0), s, voidO);⓪(Append (' /P', s, voidO);⓪(Append (protName, s, voidO);⓪&END;⓪$END;⓪$⓪$CodeName:= '';⓪$IF autoCmd = scan THEN ScanMode:= TRUE END;⓪$call (CompilerParm.name, conc (modname, s),⓪*CompilerStackSize, FALSE, FALSE, TRUE);⓪$⓪$cont:= TRUE;⓪$IF callRes # noError THEN⓪&alert (CompStr^, callMsg, OkStr^);⓪&autoCmd:= noCmd⓪$ELSE⓪&CASE exitCode OF⓪(0: IF autoCmd = scan THEN⓪/autoCmd:= edit⓪-ELSIF ~ batch THEN⓪-⓪/IF makeActive THEN⓪1CodeName:= LastCodeName;⓪/ELSE⓪1Upper (CodeName);⓪1LastCodeName:= CodeName;⓪1LastCodeSize:= CodeSize;⓪/END;⓪/IF work THEN⓪1workCName:= CodeName;⓪1writeWorkName (TextName, CodeName);⓪/END;⓪/IF autoCmd = comp_exec THEN⓪1autoCmd:= execute⓪/ELSE⓪1autoCmd:= noCmd⓪/END;⓪/⓪-END|⓪(2: DoEditBox (batch, TRUE, cont)|⓪(3: DoEditBox (batch, FALSE, cont)⓪&ELSE⓪(autoCmd:= noCmd⓪&END⓪$END⓪"END callComp;⓪ ⓪ ⓪ PROCEDURE callLink (VAR moduleName: ARRAY OF CHAR);⓪ ⓪"VAR s: ARRAY [0..124] OF CHAR;⓪"⓪"BEGIN⓪$Assign (moduleName, s, voidO);⓪$WITH LinkerParm DO⓪&IF optimize = partOptimize THEN⓪(Append (' -H', s, voidO);⓪&ELSIF optimize = nameOptimize THEN⓪(Append (' -M', s, voidO);⓪&ELSIF optimize = fullOptimize THEN⓪(Append (' -F', s, voidO);⓪&END;⓪&IF fastLoad THEN⓪(Append (' -0', s, voidO)⓪&END;⓪&IF fastCode THEN⓪(Append (' -1', s, voidO)⓪&END;⓪&IF fastMemory THEN⓪(Append (' -2', s, voidO)⓪&END;⓪&IF symbolFile THEN⓪(Append (' -S', s, voidO);⓪(Append (symbolArgs, s, voidO)⓪&END;⓪&IF outputName[0] # '' THEN⓪(Append (' -O', s, voidO);⓪(Append (outputName, s, voidO)⓪&END;⓪&call (name, s, LinkerStackSize, FALSE, FALSE, TRUE);⓪$END;⓪$IF callRes # noError THEN⓪&alert (LinkStr^, callMsg, OkStr^)⓪$END⓪"END callLink;⓪ ⓪ ⓪ PROCEDURE callMake (REF name: ARRAY OF CHAR; batch: BOOLEAN; VAR cont: BOOLEAN);⓪ ⓪"BEGIN⓪$call (shellParm.makeName, name, MakeStackSize, FALSE, FALSE, TRUE);⓪$cont:= TRUE;⓪$IF callRes # noError THEN⓪&alert (MakeStr^, callMsg, OkStr^);⓪&autoCmd:= noCmd;⓪$ELSE⓪&CASE exitCode OF⓪(0: LastCodeName:= CodeName;⓪+LastCodeSize:= 0L;⓪+ConcatPath (TemporaryPath, MakeCompFileName, TextName);⓪+ReplaceHome (TextName);⓪+IF autoCmd = make_exec THEN autoCmd:= comp_exec⓪+ELSE autoCmd:= compile END|⓪(1: IF autoCmd = make_exec THEN autoCmd:= execute⓪+ELSE autoCmd:= noCmd END|⓪(2: DoEditBox (batch, FALSE, cont)⓪&ELSE⓪(autoCmd:= noCmd;⓪&END;⓪$END⓪"END callMake;⓪ ⓪ ⓪ PROCEDURE hdscan (wrk: BOOLEAN);⓪ ⓪"BEGIN⓪$ErrorMsg:= '<Scanned>';⓪$autoCmd:= scan;⓪$IF wrk THEN callComp (workFName, TRUE, FALSE, voidO);⓪$ELSIF Empty (currFn) THEN callComp (lastFn, FALSE, FALSE, voidO)⓪$ELSE callComp (currFn, FALSE, FALSE, voidO) END;⓪"END hdscan;⓪ ⓪ PROCEDURE hdcomp (wrk: BOOLEAN);⓪ ⓪"BEGIN⓪$IF wrk THEN callComp (workFName, TRUE, FALSE, voidO);⓪$ELSE callComp (currFn, FALSE, FALSE, voidO); lastFn:= currFn; END;⓪"END hdcomp;⓪ ⓪ PROCEDURE hdlink (wrk: BOOLEAN);⓪ ⓪"BEGIN⓪$IF wrk THEN callLink (workCName)⓪$ELSE callLink (currFn) END;⓪"END hdlink;⓪"⓪ PROCEDURE hdmake (wrk: BOOLEAN);⓪ ⓪"BEGIN⓪$IF wrk THEN callMake (workFName, FALSE, voidO)⓪$ELSE callMake (currFn, FALSE, voidO) END;⓪"END hdmake;⓪ ⓪ PROCEDURE action (what: actionType; wrkFile, tool: BOOLEAN);⓪ ⓪"TYPE aTypeSet = SET OF actionType;⓪"⓪"CONST noHideAction = aTypeSet {doLoad, doUnLd, doCont};⓪"⓪"VAR s : Str128;⓪&dummy, i: CARDINAL;⓪&n1, n2 : ARRAY [0..11] OF CHAR;⓪&hidden : BOOLEAN;⓪ ⓪"BEGIN⓪$IF wrkFile THEN readWorkNames END;⓪$⓪$IF what IN noHideAction THEN hidden:= FALSE⓪$ELSE HideSS (TRUE); hidden:= TRUE END;⓪$⓪$editorsMakeCmd:= noCmd;⓪$makeActive:= FALSE;⓪$CASE what OF⓪&doEdit: hdedit (wrkFile)|⓪&doComp: hdcomp (wrkFile)|⓪&doExec: hdrun (wrkFile, tool);⓪.IF wrkFile THEN writeWorkName (workFName, workCName) END|⓪&doLink: hdlink (wrkFile)|⓪&doScan: hdscan (wrkFile)|⓪&doCpEx: autoCmd := comp_exec; hdcomp (wrkFile)|⓪&doLoad: load|⓪&doUnLd: unload|⓪&doCont: InputScan (ErrorMsg, ScanIndex);⓪.PrepareScan;⓪.IF ScanBox (TextName) THEN⓪0HideSS (TRUE); hidden:= TRUE;⓪0autoCmd:= scan;⓪0callComp (TextName, FALSE, FALSE, voidO)⓪.END|⓪&doBtch: IF wrkFile THEN ExecuteBatch (workFName, TRUE)⓪.ELSE ExecuteBatch (currFn, TRUE) END|⓪&doParm: IF wrkFile THEN LoadParameter (workFName, TRUE)⓪.ELSE LoadParameter (currFn, TRUE) END|⓪&doMake,⓪&doMkEx,⓪&doDftM: makeActive:= TRUE;⓪.autoCmd:= contMake⓪$ELSE⓪$END;⓪ ⓪$REPEAT⓪&CASE autoCmd OF⓪ ⓪(contMake: CASE what OF⓪5doMake: autoCmd:= noCmd; hdmake (wrkFile)|⓪5doMkEx: autoCmd:= make_exec; hdmake (wrkFile)|⓪5doDftM: autoCmd:= dftMake⓪3ELSE⓪5autoCmd:= editorsMakeCmd⓪3END|⓪ ⓪(edit : Concat (TextName, ' ', s, strVal);⓪3IF EditorParm.passErrorPos THEN⓪5Append (CardToStr (TextLine, 0), s, strVal);⓪5Append (' ', s, strVal);⓪5Append (CardToStr (TextCol - 1, 0), s, strVal);⓪5Append (' ', s, strVal);⓪3END;⓪3IF EditorParm.passErrorText THEN⓪5Append ('"', s, strVal);⓪5Append (ErrorMsg, s, voidO);⓪5Append ('" ', s, strVal);⓪3END;⓪3callEdit (s, TRUE)|⓪ ⓪(scan,⓪(compile,⓪(comp_exec: callComp (TextName, wrkFile, FALSE, voidO)|⓪(⓪(exec_src : autoCmd:= noCmd;⓪3workFName:= '';⓪3workCName:= '';⓪3wrkFile:= FALSE;⓪3WITH WorkField DO⓪5IF current >= 0 THEN⓪7i:= 0;⓪7LOOP (* workFile richtig bestimmen *)⓪9WITH elems[i] DO⓪;IF used & StrEqual (TextName, sourceName) THEN⓪=workFName:= sourceName;⓪=workCName:= codeName;⓪=wrkFile:= TRUE;⓪=EXIT⓪;END;⓪9END;⓪9INC (i);⓪9IF i = maxWorkFiles THEN⓪;EXIT⓪9END;⓪7END⓪5END;⓪3END;⓪3IF ~wrkFile THEN currFn:= TextName END;⓪3hdrun (wrkFile, tool);⓪3IF wrkFile THEN writeWorkName (workFName, workCName) END|⓪ ⓪(execute : autoCmd:= noCmd;⓪3call (CodeName, args, 0, TRUE, TRUE, tool)|⓪ ⓪(dftMake_exec,⓪(dftMake : IF autoCmd = dftMake_exec THEN autoCmd:= make_exec END;⓪3callMake ('' (* >> Make verw. Default-Namen aus ShellMsg *), FALSE, voidO)|⓪&ELSE⓪&END⓪$UNTIL autoCmd = noCmd;⓪$⓪$Assign (lastFn, TextName, voidO);⓪$⓪$IF hidden THEN ShowSS (TRUE) END;⓪"END action;⓪ ⓪ ⓪ ⓪ TYPE pathEntry = RECORD⓪<used: BOOLEAN;⓪<path: PathStr;⓪:END;⓪ ⓪ VAR pathArray: ARRAY [1..MaxSearchPaths] OF pathEntry;⓪ ⓪ PROCEDURE ExecuteBatch (name: ARRAY OF CHAR; load: BOOLEAN);⓪ ⓪"VAR f : File;⓪&s, arg : ARRAY[0..255] OF CHAR;⓪&gotLine, cont,⓪&doIt : BOOLEAN;⓪&result : INTEGER;⓪&oldDrive : Drive;⓪&oldPath : PathStr;⓪"⓪"PROCEDURE delSpc (VAR s:ARRAY OF CHAR);⓪$BEGIN⓪&WHILE s[0] = ' ' DO Delete (s,0,1, voidO) END⓪$END delSpc;⓪"⓪"PROCEDURE equ (a,b: ARRAY OF CHAR): BOOLEAN;⓪$BEGIN⓪&Upper (a);⓪&Upper (b);⓪&RETURN Compare (FileName (a), FileName (b)) = equal⓪$END equ;⓪ ⓪"PROCEDURE setLinkName (VAR n:ARRAY OF CHAR);⓪$VAR first: CHAR;⓪(i: CARDINAL;⓪(useEmpty: BOOLEAN;⓪$BEGIN⓪&first:=n[0];⓪&IF (first = '-') OR (first = '+') THEN⓪(Delete (n, 0, 1, voidO);⓪(delSpc (n);⓪&END;⓪&FOR useEmpty:= FALSE TO TRUE DO⓪(FOR i:= MIN (LLRange) TO MAX (LLRange) DO⓪*IF equ (LinkerParm.linkList[i].name, n)⓪*OR (useEmpty AND Empty (LinkerParm.linkList[i].name)) THEN⓪,LinkerParm.linkList[i].valid:= (first # '-');⓪,Assign (n, LinkerParm.linkList[i].name, voidO);⓪,RETURN⓪*END⓪(END⓪&END⓪$END setLinkName;⓪"⓪"PROCEDURE setToolName (VAR n:ARRAY OF CHAR);⓪$VAR i: CARDINAL;⓪$BEGIN⓪&FOR i:=1 TO MaxTool DO⓪(IF ~ToolField[i].used THEN⓪*ToolField[i].used:= TRUE;⓪*Assign (n,ToolField[i].name, voidO);⓪*RETURN⓪(END⓪&END⓪$END setToolName;⓪"⓪"PROCEDURE getFirstPath (paths: PathList; VAR path: ARRAY OF CHAR);⓪$VAR entry: PathEntry;⓪$BEGIN⓪&Lists.ResetList (paths);⓪&entry:= Lists.NextEntry (paths);⓪&IF entry # NIL THEN⓪(Assign (entry^, path, voidO)⓪&ELSE⓪(path[0]:= ''⓪&END⓪$END getFirstPath;⓪"⓪"PROCEDURE killPaths (VAR paths: PathList);⓪"⓪$VAR entry: ADDRESS;⓪(idx : CARDINAL;⓪"⓪$BEGIN⓪&Lists.ResetList (paths);⓪&entry:= Lists.PrevEntry (paths);⓪&WHILE entry # NIL DO⓪(idx:= 1;⓪(WHILE (idx <= MaxSearchPaths)⓪.AND (ADR (pathArray[idx].path) # entry) DO INC (idx) END;⓪(IF idx <= MaxSearchPaths THEN pathArray[idx].used:= FALSE END;⓪(Lists.RemoveEntry (paths, voidO);⓪(entry:= Lists.CurrentEntry (paths);⓪&END;⓪$END killPaths;⓪"⓪"PROCEDURE setP ( VAR paths: PathList );⓪$VAR err:BOOLEAN; c:CHAR; idx: CARDINAL;⓪$BEGIN⓪&killPaths (paths);⓪&idx:= 1;⓪&LOOP⓪(IF EOF (f) THEN EXIT END;⓪(Text.ReadString (f,s);⓪(IF s[0] # ' ' THEN EXIT END;⓪(WHILE (idx <= MaxSearchPaths) AND pathArray[idx].used DO INC (idx) END;⓪(IF idx <= MaxSearchPaths THEN⓪*EatSpaces (s);⓪*IF Compare ('.',s) = equal THEN s:= '' END;⓪*ValidatePath (s);⓪*Assign (s,pathArray[idx].path,err);⓪*Lists.AppendEntry (paths,ADR(pathArray[idx].path),err);⓪*pathArray[idx].used:= TRUE;⓪*INC (idx)⓪(ELSE⓪*alert (NoPathsStr^, '', OkStr^)⓪(END⓪&END;⓪&gotLine:= TRUE;⓪$END setP;⓪"⓪"PROCEDURE is (REF s0:ARRAY OF CHAR): BOOLEAN;⓪$BEGIN⓪&RETURN StrEqual (s0,s)⓪$END is;⓪ ⓪"PROCEDURE prep (REF in: ARRAY OF CHAR): BOOLEAN;⓪$BEGIN⓪&Split (in,PosLen (' ',in,0),s,arg,strVal);⓪&delSpc (arg);⓪&Upper (s);⓪&RETURN (s[0] # 0C) AND (s[0] # '*')⓪$END prep;⓪ ⓪"PROCEDURE getLC (VAR l: LONGCARD);⓪$VAR i: CARDINAL;⓪$BEGIN⓪&i:= 0;⓪&l:= StrToLCard (arg, i, strVal);⓪$END getLC;⓪ ⓪"VAR found, tell: BOOLEAN;⓪&i: CARDINAL;⓪&res : INTEGER;⓪ ⓪"PROCEDURE unTell;⓪$BEGIN⓪&IF tell THEN TellLoading (endTell, ''); tell := FALSE END;⓪$END unTell;⓪ ⓪"BEGIN⓪$ShowBee;⓪$tell:= FALSE;⓪$SearchFile (name, StdPaths, fromStart, found, name);⓪$Open (f, name, readSeqTxt);⓪$IF State (f) < 0 THEN⓪&GetStateMsg (State(f), s);⓪&alert (InfStr^, s, OkStr^);⓪$ELSE⓪&gotLine:= FALSE;⓪&cont:= TRUE;⓪&REPEAT⓪ ⓪(IF NOT gotLine THEN Text.ReadString (f, s) END;⓪(gotLine:= FALSE;⓪(⓪(doIt:= FALSE;⓪(IF prep (s) THEN⓪*IF is ('IF_SHELLSTART') THEN (* IF-Clause *)⓪,IF shellStart THEN⓪.doIt:= prep (arg);⓪,END;⓪*ELSIF is ('IF_EXITCODE') THEN⓪,i:= 0;⓪,IF StrToInt (arg, i, voidO) = exitCode THEN⓪.Copy (arg, i, 200, arg, voidO);⓪.doIt:= prep (arg);⓪,END⓪*ELSE⓪,doIt:= TRUE⓪*END;⓪(END;⓪ ⓪(IF doIt THEN⓪H(* misc *)⓪*IF is ('WAIT') THEN⓪,alert (arg,'',ContStr^);⓪*ELSIF is ('STACKSIZE') THEN⓪,getLC (DefaultStackSize);⓪,IF DefaultStackSize < 1024L THEN DefaultStackSize:= 1024 END;⓪ ⓪H(* tools *)⓪*ELSIF is ('DELETETOOLS') THEN⓪,FOR i:= 1 TO MaxTool DO ToolField[i].used:= FALSE END; (* Keine Tools *)⓪*ELSIF is ('TOOL') THEN⓪,setToolName (arg)⓪H(* loader commands *)⓪*ELSIF is ('EXEC') THEN⓪,Split (arg, PosLen (' ', arg, 0), arg, s, strVal);⓪,delSpc (s);⓪,unTell;⓪,Upper (arg);⓪,IF IsMBTFile (arg) THEN⓪.ExecuteBatch (arg, load)⓪,ELSE⓪.call (arg, s, 0, FALSE, TRUE, FALSE);⓪,END;⓪,IF autoCmd # noCmd THEN cont := FALSE END;⓪*ELSIF is ('POSTAMBLE1') THEN⓪,Split (arg,PosLen (' ',arg,0),postAmble1,postArgs1,strVal);⓪,delSpc (postArgs1);⓪,withPost1:= TRUE;⓪*ELSIF is ('POSTAMBLE2') THEN⓪,Split (arg,PosLen (' ',arg,0),postAmble2,postArgs2,strVal);⓪,delSpc (postArgs2);⓪,withPost2:= TRUE;⓪*ELSIF is ('LOAD') THEN⓪,IF load THEN⓪.IF NOT tell THEN TellLoading (initTell, ''); tell := TRUE END;⓪.TellLoading (newTellValue, arg);⓪.LoadModule (arg, StdPaths, callMsg (* dummy *), callMsg,⓪:callRes);⓪,END⓪*ELSIF is ('UNLOAD') THEN⓪,IF load THEN⓪.UnLoadModule (arg, callRes)⓪,END⓪*⓪*ELSIF is ('LINKSTACKSIZE') THEN⓪,getLC (LinkerParm.linkStackSize);⓪*ELSIF is ('NO_OPTIMIZE') THEN⓪,LinkerParm.optimize:= noOptimize ⓪*ELSIF is ('NAME_OPTIMIZE') THEN⓪,LinkerParm.optimize:= nameOptimize ⓪*ELSIF is ('PART_OPTIMIZE') THEN⓪,LinkerParm.optimize:= partOptimize ⓪*ELSIF is ('FULL_OPTIMIZE') THEN⓪,LinkerParm.optimize:= fullOptimize ⓪*ELSIF is ('DRIVER') THEN⓪,setLinkName (arg)⓪*ELSIF is ('DELETEDRIVERS') THEN⓪,SysUtil0.ClearVar (LinkerParm.linkList);⓪ ⓪H(* comp./link/make *)⓪*ELSIF is ('COMPILE') THEN⓪,autoCmd:= noCmd;⓪,unTell;⓪,callComp (arg, FALSE, TRUE, cont)⓪*ELSIF is ('MAKE') THEN⓪,autoCmd:= noCmd;⓪,unTell;⓪,callMake (arg, TRUE, cont)⓪*ELSIF is ('LINK') THEN⓪,autoCmd:= noCmd;⓪,unTell;⓪,callLink (arg)⓪*ELSIF is ('EDIT') THEN⓪,autoCmd:= noCmd;⓪,unTell;⓪,callEdit (arg, FALSE)⓪H(* paths *)⓪*ELSIF is ('SETDIR') THEN⓪,SetCurrentDir (defaultDrv, arg, voidI);⓪*ELSIF is ('SETDRIVE') THEN⓪,SetDefaultDrive (StrToDrive (arg))⓪*ELSIF is ('SETPATH') THEN⓪,SetDefaultPath (arg, voidI)⓪ ⓪*ELSIF is ('DEFAULTPATH') THEN⓪,setP ( StdPaths );⓪*ELSIF is ('DEFPATH') THEN⓪,setP ( DefPaths );⓪,getFirstPath (DefPaths, DefOutPath);⓪*ELSIF is ('IMPPATH') THEN⓪,setP ( ImpPaths );⓪,getFirstPath (ImpPaths, ImpOutPath);⓪*ELSIF is ('MODPATH') THEN⓪,setP ( ModPaths );⓪,getFirstPath (ModPaths, ModOutPath);⓪*ELSIF is ('SOURCEPATH') THEN⓪,setP ( SrcPaths )⓪*ELSIF is ('DEFOUT') THEN⓪,Assign (arg, DefOutPath, voidO);⓪,ValidatePath (DefOutPath)⓪*ELSIF is ('IMPOUT') THEN⓪,Assign (arg, ImpOutPath, voidO);⓪,ValidatePath (ImpOutPath)⓪*ELSIF is ('MODOUT') THEN⓪,Assign (arg, ModOutPath, voidO);⓪,ValidatePath (ModOutPath)⓪*ELSIF is ('MAINOUTPUTPATH') THEN⓪,Assign (arg, MainOutputPath, voidO);⓪,ValidatePath (MainOutputPath);⓪*END;⓪(⓪(END;⓪(⓪&UNTIL EOF (f) OR NOT cont;⓪&Close (f);⓪ ⓪&(* getFirstPath-Aufrufe hier weg und oben eingefügt *)⓪ ⓪$END;⓪$unTell;⓪$ShowArrow;⓪"END ExecuteBatch;⓪ ⓪ VAR level : CARDINAL;⓪ ⓪ PROCEDURE envlpProc (start, inChild:BOOLEAN; VAR i:INTEGER);⓪ ⓪"BEGIN⓪$IF ~inChild THEN⓪&IF start THEN⓪(IF level = 0 THEN⓪*IF shellParm.breakActive THEN voidO:=EnableBreak () END⓪(END;⓪(INC (level);⓪&ELSE⓪(DEC (level);⓪(IF level = 0 THEN⓪*IF shellParm.breakActive THEN DisableBreak END;⓪(END;⓪&END⓪$END;⓪"END envlpProc;⓪"⓪"⓪ VAR oldOpen : InOutBase.OpenProc;⓪(oldClose: InOutBase.ClsProc;⓪ ⓪ PROCEDURE myOpen (x, y: CARDINAL);⓪ ⓪"BEGIN⓪$IF NOT callSwitchedToTextMode THEN⓪&HideMouse;⓪&clrscr;⓪&curon;⓪$END;⓪$oldOpen (x, y);⓪"END myOpen;⓪ ⓪ PROCEDURE myClose;⓪ ⓪"BEGIN⓪$IF NOT callSwitchedToTextMode THEN⓪&curoff;⓪&ShowMouse⓪$END;⓪$oldClose;⓪"END myClose;⓪ ⓪ ⓪ VAR err : BOOLEAN;⓪(wsp : MemArea;⓪(envlpHdl: EnvlpCarrier;⓪(ch : CHAR;⓪(idx : CARDINAL;⓪ ⓪ BEGIN (* Main of MShell *)⓪ ⓪"(* ShellMsg - Variablen initialisieren⓪#*)⓪"Active:= TRUE;⓪"⓪"(* Pfadlisten anlegen⓪#*)⓪"Lists.CreateList (StdPaths,err);⓪"Lists.CreateList (DefPaths,err);⓪"Lists.CreateList (ImpPaths,err);⓪"Lists.CreateList (ModPaths,err);⓪"Lists.CreateList (SrcPaths,err);⓪"FOR idx:= 1 TO MaxSearchPaths DO pathArray[idx].used:= FALSE END;⓪ ⓪"autoCmd:= noCmd;⓪"⓪"shellStart:= TRUE;⓪"⓪"IF InitSS () THEN⓪"⓪$(* Kontrolle gestarteter Prozesse zur Ctrl-C - Aktivierung⓪%*)⓪$SetEnvelope (envlpHdl, envlpProc, wsp);⓪$⓪$(* Link into 'InOutBase' driver procs⓪%*)⓪$oldOpen := InOutBase.OpenWdw;⓪$InOutBase.OpenWdw := myOpen;⓪$oldClose := InOutBase.CloseWdw;⓪$InOutBase.CloseWdw := myClose;⓪$⓪$shellStart:= FALSE;⓪$(*$? UseExtKeys: InstallKbdEvents; *)⓪$TalkWithUser; (* Hauptschleife der Shell *)⓪$(*$? UseExtKeys: DeInstallKbdEvents; *)⓪ ⓪$IF withPost1 THEN⓪&call (postAmble1, postArgs1, 0L, FALSE, TRUE, FALSE);⓪$END;⓪$IF withPost2 THEN⓪&call (postAmble2, postArgs2, 0L, FALSE, TRUE, FALSE);⓪$END;⓪ ⓪$InOutBase.OpenWdw := oldOpen;⓪$InOutBase.CloseWdw := oldClose;⓪ ⓪$(* eigenen Namen löschen, damit GEMINI die Shell nicht nochmal startet *)⓪$IF DoShellWrite & (GEMEnv.GEMVersion () >= $140) THEN⓪&IF NOT multiTOS THEN⓪(AESMisc.ShellWrite (FALSE, AESMisc.graphicPrgm, '', '');⓪&END⓪$END;⓪ ⓪$ExitSS;⓪ ⓪"ELSE⓪$TermProcess (fInsufficientMemory)⓪"END;⓪"⓪ END MM2TinyShell.⓪ ə
- (* $000096BA$FFEE34BD$000126F0$000171BA$FFF7016F$FFF7016F$FFF7016F$FFF7016F$FFF7016F$FFEC1D4A$FFF7016F$000001C2$FFF7016F$0001A06C$FFF7016F$FFEC67A7$FFF7016F$00005FE8$FFED6C22$FFF7016F$FFED6C22$00011614$FFF7016F$FFF7016F$FFF64330$00002098$FFE96D50$FFF7016F$FFF7016F$00014F4A$FFF7016F$FFF7016F$FFF7016F$FFF7016F$FFE96809$0001159C$FFEE34BD$FFF7016F$00004278$0000723D$FFF7016F$FFF7016FÇ$000029C4T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$00000C82$00002FC6$000029C4$0000A2FA$000001C2$00001493$000001C2$00000781$000001C2$FFDEC118$0000A61B$0000A5CE$0000A5B0$000029C4$FFE18A32$00000C59£Çâ*)
-